使用 Google App Engine 在服务器端读取 ID3 标签
Posted
技术标签:
【中文标题】使用 Google App Engine 在服务器端读取 ID3 标签【英文标题】:Server-side Reading of ID3 tags with Google App Engine 【发布时间】:2012-07-30 16:17:09 【问题描述】:我已经寻找了几个星期来寻找一种解决方案,该解决方案允许我从已上传到 Google App Engine 的 mp3 文件中读取 id3 标签。上传的文件存储在 Blobstore 中,我正在使用 Java 进行编码。
我想请求帮助完成两项任务:
-
我想访问可以从最流行的音频文件格式读取 id3 信息的库或方法。我已经尝试了一些可以做到这一点的库,但它们都需要访问 GAE 不支持的 java.io.File。因此,必须从内存或其他 GAE 支持的访问方法中读取帧/标签。
我想知道如何从 doPost 方法中获取字节,而不是再次访问 blobstore。
下面是我希望完成的代码:
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException
Map<String, List<BlobKey>> blobs = blobstoreService.getUploads(req);
List<BlobKey> blobKeys = blobs.get("aud-file");
BlobKey fileKey = blobKeys.get(0);
BlobInfo info = blobInfoFactory.loadBlobInfo(fileKey);
String filename = info.getFilename();
long size = info.getSize();
Date created = info.getCreation();
String key = info.getBlobKey().getKeyString();
// TODO: Get mp3 file that was just uploaded and retrieve ID3 tag
// info.
SimpleDateFormat formatter = new SimpleDateFormat();
formatter.applyPattern("yyyy-MM-dd'T'HH:mm:ss.SSSZ");
StringBuilder builder = new StringBuilder();
builder.append("<?xml version=\"1.0\" ?>");
builder.append("<file name=\"" + filename + "\" ");
builder.append("size=\"" + Long.toString(size) + "\" ");
builder.append("created=\""
+ formatter.format(created).toString() + "\" ");
builder.append("key=\"" + key + "\">");
// TODO: append Title, Artist, and Duration of audio file for
// response to client side code
builder.append("</file>");
resp.setStatus(HttpServletResponse.SC_OK);
resp.setContentType("text/html;charset=\"utf-8\"");
PrintWriter writer = resp.getWriter();
writer.write(builder.toString());
writer.flush();
writer.close();
上面的代码正在运行,对于任何想要从上传的文件中检索信息的人来说,这似乎是一个很好的模式。 (如果在 Eclipse 中进行本地测试,请确保将您的 bindAddress 标志设置为本地机器名称,并将该名称作为主机添加到 GWT 开发人员插件选项中。)提前感谢您对此请求的任何帮助。
克里斯
【问题讨论】:
使用 blobstore 有什么问题? 嗨,Shay,我正在使用 blobstore。我的问题是我正在尝试从文件中读取 id3 数据。 【参考方案1】:您可以尝试使用Jaudiotagger。唯一的问题是它需要一个可读的java.io.File
。
要完成这项工作,您可以尝试使用File
wrapper for GAE。一个使用它的例子是here。
【讨论】:
嗨彼得,这可能需要一点时间来验证,但我会试一试,看看它是否有效。我一定会记录我的结果。【参考方案2】:使用 blobstore 和 createUploadUrl 上传文件后,数据已经在 blobstore 中,您可以仅使用 blobstore API 访问它。
【讨论】:
【参考方案3】:使用 GAE 存储任何类型的较大文件都不是一个好主意。 根据wiki article,请求/响应时间以及可以传输的数据量都有硬性限制:
响应必须在 60 秒内返回(假设您的文件很大且连接速度很慢,这可能是个问题) 请求最大可以为 1MB(不限于此) 响应最大为 32 MB 我还认为 Blob 存储中的条目限制为 1MB(因此,即使您设法将文件放在那里,也必须将文件拆分为多个条目)我认为如果你在做一些实际工作之前做一些测试会很好。
【讨论】:
以上是关于使用 Google App Engine 在服务器端读取 ID3 标签的主要内容,如果未能解决你的问题,请参考以下文章
Google App Engine 通过内部网络与 Compute Engine 通信
使用 rtmplite 在 Google App Engine 中录制音频?
如何在 Google App Engine 中使用 sbt?
Blobstore 图像在 Google App Engine 开发服务器上消失