1

いくつかのファイルを圧縮してユーザーのデスクトップにダウンロードする次のコードがあります。

def download
    info.find(params[:id])

  if File.exists?("my_file.zip")
    File.delete("my_file.zip")
  end

  zipfile = Zip::ZipFile.open("my_file.zip", Zip::ZipFile::CREATE)
  file1 =  "#{Rails.root}/tmp/myfile1.txt"
  file2 =  "#{Rails.root}/tmp/myfile2.txt"

  File.open(file1, 'wb') { |file| file.write(info.first['my_file1']) }
  File.open(file2, 'wb') { |file| file.write(info.first['my_file2']) }

  zipfile.add("myfile1.txt", file1)
  zipfile.add("myfile2.txt", file2)

  zipfile.close

  File.delete(file1)
  File.delete(file2)

  send_data zipfile, :type => 'application/zip', :filename => "test.zip"
end

このコードは、ファイルを圧縮してユーザーのコンピューターにダウンロードしているようです。しかし、それを開こうとすると、次のエラーがスローされます。

the archive is in unknown format or damaged

サーバーに sftp して同じソフトウェアで zip ファイルを開くと、問題なく動作し、すべてのファイルが表示されるため、ファイルが破損しているとは思いません。

間違っているのは次の行でしょうか?

send_data zipfile, :type => 'application/zip', :filename => "test.zip"
4

1 に答える 1

1

zipfileオブジェクトを送信しているように見えます。send_dataメソッドは、指定されたオブジェクトに含まれるバイナリ データを送信します。したがって、おそらくデータを送信するだけzipfile.to_sです。

send_file次のように、おそらくあなたが望むものです:

send_file 'my_file.zip', type: 'application/zip', filename: 'test.zip'
于 2014-11-12T18:48:45.723 に答える