从activeadmin批处理操作下载zip文件

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从activeadmin批处理操作下载zip文件相关的知识,希望对你有一定的参考价值。

我想send_data给在我们网站上使用activeadmin界面的管理员。此数据是一个zip文件,如果符合所选项目的某些条件,则可以下载该数据。

我创建了一个处理它背后的逻辑(非常复杂)的服务。所以从activeadmin我可以打电话:

batch_action :action_name, form: {selection: ['...']} do |ids, inputs|
  response = MyService.new(ids, inputs[:selection]).my_method
  redirect_to collection_path
end

在我的服务MyService.rb

...
def my_method
  ...
  if condition
    zip_data = Zip::OutputStream.write_buffer do |zip|
      zip.put_next_entry("#{original_file_name}.xml")
      zip << File.read(original_file)
    end
    send_data(zip_data.read, :type => 'application/zip', :filename => "#{original_file_name}.zip")
    # here send_data throws an error because it's a controller method
  else
    ...
  end
  ...
end
...

但是如何正确使用send_data方法呢?也许我必须重组一些东西?我知道你可以在控制器之外做ActionController::DataStreaming.send_data(...),但是为了代码的缘故,不推荐这样做。

答案

解决了。我把send_datain这样的batch_action代码:

batch_action :action_name, form: {selection: ['...']} do |ids, inputs|
  response = MyService.new(ids, inputs[:selection]).my_method
  redirect_to collection_path
  send_data(response[:zip][:data].read, :type => 'application/zip', :filename => "#{response[:zip][:name]}.zip") if response[:zip].present?
end

其中响应包含要发送的zip数据(需要在发送之前用zip_data.rewind重新进行)。 my_service.rb现在像:

...
def my_method
  ...
  if condition
    zip_data = Zip::OutputStream.write_buffer do |zip|
      zip.put_next_entry("#{original_file_name}.xml")
      zip << File.read(original_file)
    end
    zip_data.rewind
    response[:zip] = {data: zip_data, name: original_file_name}
  else
    ...
  end
  ...
end
...

以上是关于从activeadmin批处理操作下载zip文件的主要内容,如果未能解决你的问题,请参考以下文章

从 URL 下载 Windows 批处理文件文件

使用 windows 批处理指令(BAT文件)进行压缩文件(zip)解压操作

从 Azure blob 存储下载所有文件,对其进行压缩并以 JAVA 格式上传 zip 文件

Active Admin表单仅显示“# ”

ZIP格式的文件下载后怎么解压?

如何存储 zip 文件数据