在Android上通过浏览器下载文件时避免内容类型问题

Bry*_*eld 16 browser android content-type download content-disposition

如果我通过webapp将文件提供给浏览器,我通常只需将URL设置为http://website.com/webapp/download/89347/image.jpg.然后我设置HTTP标头Content-Type: application/octet-stream; filename=image.jpgContent-Disposition: Attachment.

但是,在Android上.似乎我可以将文件下载的唯一方法是设置Content-Type: image/jpg.否则文件名会出现<Unknown>并出现错误

下载失败
无法下载.此手机不支持该内容

有没有办法让Android下载并通过浏览器打开文件而不保留mime类型列表?

Jps*_*psy 25

要使所有(特别是旧版本)Android版本按预期进行任何下载,您需要...

  1. 将ContentType设置为application/octet-stream
  2. 将Content-Disposition文件名值放在双引号中
  3. 在UPPERCASE中编写Content-Disposition文件扩展名

阅读我的博客文章了解更多详情:http:
//digiblog.de/2011/04/19/android-and-the-download-file-headers/

  • #3 肯定是需要的。我已经将我的服务器设置为发送我自己的 mimetype,但是当我将文件扩展名更改为大写时,android 仍然将其保存为 application/octet-stream 它有效。 (2认同)

小智 10

如果html页面出现在你下载的文件中,Dmitriy(或其他寻找可能解决方案的人),我怀疑这是由于双重HttpRequest GET问题.典型的场景是以下POST,Redirect,GET模型:

  • Android浏览器向服务器发出HttpRequest POST(例如提交按钮或链接以请求下载文件,filename.ext说)

  • 服务器将请求的filename.ext流式传输到字节,存储在会话变量中,然后发出Response.Redirect到Download.aspx,例如,处理响应对象构造

  • Android浏览器正确地将HttpRequest GET发送到服务器以获取Download.aspx

  • 服务器响应典型的内容处理:附件; filename ="filename.ext"样式构造,其响应对象包含所请求的filename.ext,即会话变量中的字节.

  • 我相信,Android下载管理器会向服务器发送另一个HttpRequest GET以获取Download.aspx.我怀疑下载管理器将之前的"附件"响应解释为发送第二个GET的触发器.

  • Server(Download.aspx)再次尝试构造响应对象以发送回浏览器.

  • Android下载管理器使用第二个Download.aspx中的响应对象内容下载filename.ext.

在许多情况下,这很好.但是,例如,如果Download.aspx代码中的服务器执行一些内务处理并在第一次调用时删除会话变量,则下一次没有会话变量.因此,根据代码的编写方式,可能是响应对象没有明确构造,也许Response.End不会被调用,所以只有Download.aspx的html最终被发送.

这是我们使用Wireshark发现的,虽然我承认我假设它是Android下载管理器,这是双GET的原因.

我希望这个解释有所帮助.

  • 史蒂夫,你的解释非常符合我博客文章评论者的观察结果(在上面的答案中提到).即使使用更高的Android版本(至少高达3.2.1),这似乎也会出现问题,并且似乎取决于使用的浏览器(受影响的Dolphin和Android股票,FF和Opera不受影响).一种可能的解决方案是用GET替换第一个请求或将所有需要的数据编码(如果可能)到下载请求的URL中.干杯,约尔格. (3认同)