由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
Java版 - Servlet如何Stream mp3文件?
相关主题
SpringMVC可否直接处理doGet?servlet是否可以在doGet里面返回304
一个servlet问题问一个blocking IO的程序
求助!Tomcat下设置servlets的问题Servlet question: the orig filename
Tomcat Servlet: synchronized vs non-synchronized methodsservlet programming 怪问题
A Servlet query string questionHow do I send cookies from a servlet?
不明白servlet, applet到底啥区别,还有jsp理解Java Servlets [fwd]
大家都是怎么自学J2EE的Another Servlet Problem:Browser Caching
servlet的精华到底是啥?need your comments
相关话题的讨论汇总
话题: filename话题: bytecount话题: servlet话题: content话题: buffer
进入Java版参与讨论
1 (共1页)
b***i
发帖数: 3043
1
我说的stream,就是把链接放入浏览器,就立即开始播放,一边播放,一边下载。
如果我用godaddy的服务器,放入一个静态文件,是可以这样的。
下面是我放入google app engine的servlet, 和一般servlet略为不同就是input/
outputstream有些不同,但原则都一样,结果是浏览器等待文件下载完毕后才打开,请
问为什么?如何改进?谢谢
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){
}
}
b***i
发帖数: 3043
2
补充一点,正确的response是
HTTP/1.1 200 OK
Date: Mon, 27 Feb 2012 04:25:54 GMT
Server: Apache
Last-Modified: Sun, 27 Nov 2011 05:05:40 GMT
ETag: "1530c7-1a1ac3-442b0566f0745"
Accept-Ranges: bytes
Content-Length: 1055427
Cache-Control: max-age=1209600
Expires: Mon, 12 Mar 2012 04:25:54 GMT
Content-Type: audio/mpeg
我是否要加上 setHeader来设定这些?到底是什么使得原来的goDaddy上面的http://xxx.com/a.mp3可以立即播放,而我的通过servlet的要下载后?我把 res.setHeader("Content-Disposition", "attachment; filename="" + "a.mp3
删掉也不行。

mp3

【在 b***i 的大作中提到】
: 我说的stream,就是把链接放入浏览器,就立即开始播放,一边播放,一边下载。
: 如果我用godaddy的服务器,放入一个静态文件,是可以这样的。
: 下面是我放入google app engine的servlet, 和一般servlet略为不同就是input/
: outputstream有些不同,但原则都一样,结果是浏览器等待文件下载完毕后才打开,请
: 问为什么?如何改进?谢谢
: 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

b***i
发帖数: 3043
3
我说的stream,就是把链接放入浏览器,就立即开始播放,一边播放,一边下载。
如果我用godaddy的服务器,放入一个静态文件,是可以这样的。
下面是我放入google app engine的servlet, 和一般servlet略为不同就是input/
outputstream有些不同,但原则都一样,结果是浏览器等待文件下载完毕后才打开,请
问为什么?如何改进?谢谢
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){
}
}
b***i
发帖数: 3043
4
补充一点,正确的response是
HTTP/1.1 200 OK
Date: Mon, 27 Feb 2012 04:25:54 GMT
Server: Apache
Last-Modified: Sun, 27 Nov 2011 05:05:40 GMT
ETag: "1530c7-1a1ac3-442b0566f0745"
Accept-Ranges: bytes
Content-Length: 1055427
Cache-Control: max-age=1209600
Expires: Mon, 12 Mar 2012 04:25:54 GMT
Content-Type: audio/mpeg
我是否要加上 setHeader来设定这些?到底是什么使得原来的goDaddy上面的http://xxx.com/a.mp3可以立即播放,而我的通过servlet的要下载后?我把 res.setHeader("Content-Disposition", "attachment; filename="" + "a.mp3
删掉也不行。

mp3

【在 b***i 的大作中提到】
: 我说的stream,就是把链接放入浏览器,就立即开始播放,一边播放,一边下载。
: 如果我用godaddy的服务器,放入一个静态文件,是可以这样的。
: 下面是我放入google app engine的servlet, 和一般servlet略为不同就是input/
: outputstream有些不同,但原则都一样,结果是浏览器等待文件下载完毕后才打开,请
: 问为什么?如何改进?谢谢
: 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

m*****k
发帖数: 731
5
chunk?
App server setting?
This post seems to have something:
http://stackoverflow.com/questions/685271/using-servletoutputst
1 (共1页)
进入Java版参与讨论
相关主题
need your commentsA Servlet query string question
请推荐servlet还有jsp的书不明白servlet, applet到底啥区别,还有jsp
servlet读取directory的基本问题大家都是怎么自学J2EE的
运行servlet时出现的http status 404问题servlet的精华到底是啥?
SpringMVC可否直接处理doGet?servlet是否可以在doGet里面返回304
一个servlet问题问一个blocking IO的程序
求助!Tomcat下设置servlets的问题Servlet question: the orig filename
Tomcat Servlet: synchronized vs non-synchronized methodsservlet programming 怪问题
相关话题的讨论汇总
话题: filename话题: bytecount话题: servlet话题: content话题: buffer