【发布时间】: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