目标:构建一个servlet,以便在浏览器中输入 http://xxx.com/servpage?a.mp3 时,我可以立即开始播放这个mp3文件。以前如果我把文件放在goDaddy上作为静态文件,我可以这样做。我的软件可以立即播放。
使用Servlet,我可以忽略后面的内容?,只想让这个页面动态返回mp3(因为将来我可能会返回任何其他文件)。我得到的是漫长的等待(> 20秒),然后让玩家玩它。
我按照一些例子,注意到示例中的“附件”。但是,如果我删除它,MP3将无法播放。我虽然使用了Google App Engine,但只需使用输入/输出流来返回http请求。有人可以帮忙吗?
public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException ,IOException {
res.setContentType("audio/mpeg3");
OutputStream os = res.getOutputStream();
res.setHeader("Content-Disposition", "attachment; filename="" + "a.mp3";");
res.setContentLength(1000000);
FileService fileService = FileServiceFactory.getFileService();
boolean lockForRead = false;
String filename = "/gs/" + BUCKETNAME + "/" + FILENAME;
AppEngineFile readableFile = new AppEngineFile(filename);
try{
FileReadChannel readChannel = fileService.openReadChannel(readableFile, lockForRead);
InputStream is = Channels.newInputStream(readChannel);
int BUFF_SIZE = 1024;
byte[] buffer = new byte[BUFF_SIZE];
try {
do {
int byteCount = is.read(buffer);
if (byteCount == -1)
break;
os.write(buffer, 0, byteCount);
os.flush();
} while (true);
} catch (Exception excp) {
} finally {
os.close();
is.close();
}
readChannel.close();
} catch(Exception e){
}
}
答案 0 :(得分:2)
很少注意到:
你没有做“流媒体”。只是简单的文件下载。
要执行blob(文件)服务,您不需要像使用AppEngineFile
一样从BlobStore读取blob。只需使用blobstoreService.serve(blobKey)
直接投放即可。有关示例,请参阅Serving a Blob。
您可以通过BlobKey
获得2. {<1}}所需的fileService.getBlobKey(readableFile)
。
<强>更新强>
刚刚意识到您使用的是Google云端存储,而不是BlobStore。
在GS中,如果正确设置了ACL,则可以通过以下方式公开显示文件:http://commondatastorage.googleapis.com/BUCKETNAME/FILENAME
由于您没有进行任何身份验证,您可以在GS上公开共享该文件,然后在您的servlet中执行301重定向到该文件的公共URL。