所以目前正在开发一个项目并遇到一个奇怪的问题,即ios版本的Safari涉及从服务器回放音频文件。
我目前面临以下问题:
现在,音频文件通过java scriptlet提供,该脚本使用以下代码片段为文件提供服务:
String fn = saveTo + file_name;
f = new File(fn);
String fname = f.getName();
String contentType = "audio/wav";
if(fname.endsWith("mp3")){
contentType = "audio/mp3";
}
response.setContentType(contentType);
response.setHeader("Content-Transfer-Encoding", "binary");
response.setHeader("Content-disposition", "attachment;filename="+f.getName());
response.setHeader("Content-Length", ""+f.length());
FileInputStream fin = null;
try{
fin = new FileInputStream(f.getCanonicalFile());
byte[] data = new byte[1024];
int x = 0;
while((x = fin.read(data, 0, 1024))>=0){
response.getOutputStream().write(data, 0, x);
Thread.sleep(1);
}
} finally {
if(fin != null) {
try{
fin.close();
}catch(Exception ex){}
}
}
现在我知道代码在任何方面都不是最好的,它不是我的代码,我们显然正在假设找到了文件。
我发现在Mac上使用调试模式调试iPhone时,它似乎没有显示返回状态代码。它显示没有响应头但显然必须收到一些东西。服务器日志似乎认为它返回状态200,这在Chrome和Firefox中显示。
上面的代码似乎适用于Chrome和Firefox,但不适用于Safari。
我猜的唯一一件事就是它与文件如何被推送到Safari不喜欢的输出流有关,或者它可能会混淆并且应该有不同的状态代码。我已经对这个问题进行了几天的讨论,尽可能多地阅读Safari,尽管我发现的大多数文档都是关于它的“独特”的网络音频实现,以及使用单通道似乎与此无关。
任何帮助都将不胜感激。
答案 0 :(得分:1)
我在iOS上遇到了与Safari相同的问题,经过大量调试后,我发现问题与应用于响应的标头组合有关。
我的应用程序是基于C#的,但此解决方案应该是独立于平台的(因为如前所述,它是响应头问题)。
必要的标题:
我在检查了通过Akamai的内容分发服务提供的MP3响应后设计了这个。