Http 为什么赢了';Chrome或Safari能否正确播放我的MP3?

Http 为什么赢了';Chrome或Safari能否正确播放我的MP3?,http,servlets,audio,webkit,http-headers,Http,Servlets,Audio,Webkit,Http Headers,我有一个在Glassfish上运行的web应用程序。应用程序是使用servlet用Java编写的 该应用程序允许您上载文件并获得指向该文件的直接链接 出于某些原因,Safari和Chrome(可能是其他浏览器)在播放上传到此应用程序的MP3文件(以及其他音频/视频文件)时出现问题 上传MP3的示例: 有时,Safari会加载文件并正确播放,但大部分时间它要么永远保持“加载…”状态,要么开始播放几秒钟,然后停止下载 我的浏览器正在发送以下请求标题: GET http://uploads.graal

我有一个在Glassfish上运行的web应用程序。应用程序是使用servlet用Java编写的

该应用程序允许您上载文件并获得指向该文件的直接链接

出于某些原因,Safari和Chrome(可能是其他浏览器)在播放上传到此应用程序的MP3文件(以及其他音频/视频文件)时出现问题

上传MP3的示例:

有时,Safari会加载文件并正确播放,但大部分时间它要么永远保持“加载…”状态,要么开始播放几秒钟,然后停止下载

我的浏览器正在发送以下请求标题:

GET http://uploads.graalcenter.org/upload/test.mp3 HTTP/1.1 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7) AppleWebKit/535.1+ (KHTML, like Gecko) Version/5.1 Safari/534.48.3 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Referer: http://uploads.graalcenter.org/info/test.mp3 Cache-Control: max-age=0 收到http://uploads.graalcenter.org/upload/test.mp3 HTTP/1.1 用户代理:Mozilla/5.0(Macintosh;英特尔Mac OS X 10_7)AppleWebKit/535.1+(KHTML,如Gecko)版本/5.1 Safari/534.48.3 接受:text/html、application/xhtml+xml、application/xml;q=0.9,*/*;q=0.8 推荐人:http://uploads.graalcenter.org/info/test.mp3 缓存控制:最大年龄=0 我的服务器正在使用以下响应头进行响应:

HTTP/1.1 200 OK Date: Sun, 31 Jul 2011 02:02:03 GMT X-Powered-By: Servlet/3.0 JSP/2.2 (GlassFish Server Open Source Edition 3.2-b06 Java/Sun Microsystems Inc./1.6) Content-Length: 1137602 Server: GlassFish Server Open Source Edition 3.2-b06 Content-Type: audio/mpeg Accept-Ranges: none HTTP/1.1 200 OK Date: Sun, 31 Jul 2011 02:06:56 GMT Connection: Keep-Alive Content-Length: 1137602 Last-Modified: Sun, 31 Jul 2011 02:05:57 GMT Server: Apache Etag: "1aa08001-115bc2-4a953f48b6b40" Content-Type: audio/mpeg Accept-Ranges: bytes Keep-Alive: timeout=2, max=100 HTTP/1.1200ok 日期:2011年7月31日星期日02:02:03 GMT X-Powered-By:Servlet/3.0JSP/2.2(GlassFish服务器开源版本3.2-B06Java/Sun Microsystems Inc./1.6) 内容长度:1137602 服务器:GlassFish服务器开源版本3.2-b06 内容类型:音频/mpeg 接受范围:无 为了进行比较,我已将相同的文件上载到Apache服务器

服务器使用以下标题进行响应:

HTTP/1.1 200 OK Date: Sun, 31 Jul 2011 02:02:03 GMT X-Powered-By: Servlet/3.0 JSP/2.2 (GlassFish Server Open Source Edition 3.2-b06 Java/Sun Microsystems Inc./1.6) Content-Length: 1137602 Server: GlassFish Server Open Source Edition 3.2-b06 Content-Type: audio/mpeg Accept-Ranges: none HTTP/1.1 200 OK Date: Sun, 31 Jul 2011 02:06:56 GMT Connection: Keep-Alive Content-Length: 1137602 Last-Modified: Sun, 31 Jul 2011 02:05:57 GMT Server: Apache Etag: "1aa08001-115bc2-4a953f48b6b40" Content-Type: audio/mpeg Accept-Ranges: bytes Keep-Alive: timeout=2, max=100 HTTP/1.1200ok 日期:2011年7月31日星期日02:06:56 GMT 连接:保持活力 内容长度:1137602 最后修改:2011年7月31日星期日02:05:57 GMT 服务器:Apache Etag:“1aa08001-115bc2-4a953f48b6b40” 内容类型:音频/mpeg 接受范围:字节 保持活动状态:超时=2,最大值=100 文件播放正确

我能看到的唯一区别是我的应用程序不接受范围请求,但这不会导致任何问题,对吗

如果我通过curl从web应用程序下载MP3,它具有相同的MD5散列,因此它不会以任何方式损坏MP3


有人知道是什么原因导致MP3不能正常播放吗?

问题似乎是AppleCoreMedia,一个处理音频的插件,在不使用范围数据时不能正常工作。我不会把责任推到苹果身上,因为我完全有可能犯了一些错误,但我最终实现了HTTP范围头,现在它每次都能工作。

问题似乎是AppleCoreMedia,一个处理音频的插件,在不使用范围数据时不能正常工作。我不会把责任推到苹果身上,因为我完全有可能犯了一些错误,但我最终实现了HTTP范围头,现在它每次都能工作。

您是通过一个自制的servlet提供文件,还是将任务委托给Glassfish的默认servlet?如果Glassfish默认servlet不支持范围请求和Etag头之类的内容,我会非常惊讶。无论如何,我不做Safari,但我认为罪魁祸首是缺少
连接:Keep Alive
头。我自己发送输出(IOUtils.copy(fileStream,out))。我会试试那个标题,谢谢。您是通过一个自制的servlet来提供文件,还是将任务委托给Glassfish的默认servlet?如果Glassfish默认servlet不支持范围请求和Etag头之类的内容,我会非常惊讶。无论如何,我不做Safari,但我认为罪魁祸首是缺少
连接:Keep Alive
头。我自己发送输出(IOUtils.copy(fileStream,out))。我会试试那个标题,谢谢。我不确定是不是这样。我在windows上遇到了相同的问题。我不确定情况是否如此。我在windows上遇到同样的问题。