Rails 使用 send_file 下载文件问题

mz2test · 2017年08月09日 · 最后由 mz2test 回复于 2017年08月10日 · 3092 次阅读

使用前后端分离的方式写文件下载时,在 chrome 浏览器中下载没问题,到了 IE 上就显示乱码,请教一下是什么问题造成的,该怎么解决? 下面是代码:

def show
    asset = Asset.find(params[:id])
    if asset.try(:file).try(:file).try(:file)
      send_file(asset.file.file.file, filename: asset.file_name)
    else
      render nothing: true
    end
  end

Asset 中:

def downloadPath
  Rails.application.routes.url_helpers.api_v1_asset_url(:host => Settings.app_host, :id => self.id)
end

用 iconv 转换一下,转成 GBK Iconv.conv('gbk//IGNORE', 'utf-8', ....)

我使用的这种形式,不知道大家有没有更好的建议:

user_agent = request.user_agent.downcase
      Rails.logger.info("浏览器 user_agent: #{user_agent}")
      @file_name = asset.file_name
      @escaped_file_name = (user_agent.include?('trident') || user_agent.include?('edge')) ? CGI::escape(@file_name) : @file_name
      send_file(asset.file.file.file, :type=>'application/octet-stream;charset=utf-8', filename: @escaped_file_name, :x_sendfile=>true)

主要问题应该是响应头部 Content-Type。

zhangkaizhao 回复

我用上面代码解决了现有问题,是 trident 内核和 edge 内核的编码问题,暂时解决了当前的问题。

mz2test 关闭了讨论。 09月14日 09:12
mz2test 重新开启了讨论。 09月14日 09:12
需要 登录 后方可回复, 如果你还没有账号请 注册新账号