【问题标题】:Can an axios request be used to get a zip file from a Rails endpoint?可以使用 axios 请求从 Rails 端点获取 zip 文件吗?
【发布时间】:2021-04-01 08:33:00
【问题描述】:

我正在尝试向使用压缩文件响应的 Rails 控制器方法发出请求。前端 Axios 请求怎么做?

控制器方法:

include ActionController::Streaming
include Zipline

def index
  respond_to do |format|
    format.zip do
      zipline([[@project.attached.url, "#{@project_name.parameterize}.pdf"]], "documents.zip")
    end
  end
end

如果我使用视图我会做什么:

= link_to "Download projects", company_projects_path(@company, format: :zip)

等效的 axios 请求是什么样的?这不起作用:

  const handleClick = () => {
    axios
    .get(`/projects/${project.id}`, {
      headers: { 'Accept': 'application/zip' }
    })
    .catch(e => console.log(e))
  };

【问题讨论】:

  • 当您回复应下载的格式(pdf、zip 等)时,您想使用send_file 设置正确的响应标头。我不知道为什么您真的想将 zip 作为一组文件“渲染”,而这并不是您真正会用视图渲染的东西。我会使用一个服务对象或仅返回您的控制器使用的临时文件或文件句柄的东西,并且它会完成收集要压缩的文件的实际工作。
  • 正确的mime类型也是application/zip
  • 好的,谢谢 max,方法名称混淆了这个问题。我已经更新了这个问题。我正在使用 zipline 来收集文件。
  • 很抱歉打扰了,但如果只是一个文件,为什么要压缩? zip 和 gzip 都使用 DEFLATE 算法,但几乎所有现有浏览器都可以在传输层上无缝处理 GZIP 压缩。只需使用 Rack::Deflater 代替,它不会要求您的用户在他们的末端毫无意义地解压缩 zip 文件。 thoughtbot.com/blog/content-compression-with-rack-deflater
  • 不用担心。所以在这个例子中它是 1 个文件,但我会根据要求压缩几个文件。谢谢你的链接,我会读一读。我已经通过使用锚标签解决了这个问题。

标签: ruby-on-rails reactjs request axios


【解决方案1】:

所以我发现这对我有用:

<a href={`/projects/${project.id}.zip`} download>Download all</a>

而不是使用带有 onClick axios 请求的按钮将压缩文件流式传输到它 - 这没有任何意义 - 只需创建一个具有指向 zip 路径链接的锚标记即可下载它。

正如 max 指出的那样,headers: { 'Accept': 'application/zip' } 是访问它的正确格式,但这样做没有意义。

编辑:

结帐this answer。浏览器会抛出错误Resource interpreted as Document but transferred with MIME type application/zip

【讨论】:

    猜你喜欢
    • 2018-05-31
    • 1970-01-01
    • 2020-12-27
    • 2021-12-29
    • 2013-07-05
    • 1970-01-01
    • 1970-01-01
    • 2018-02-09
    • 2017-10-26
    相关资源
    最近更新 更多