Base64编码的字符串到文件(Ruby on Rails)

我要求在使用Base64编码对zip文件进行编码后将其发送到ROR应用程序。 我应解码它,将其保存为zipfile并解压缩并执行一些操作。 他们通过POST方法将zip文件编码数据作为zip参数发送。 这是我在代码中所做的。

 require 'rubygems' require 'zip/zip' require 'base64' def get_pdf encoded_data = Base64.decode64(params[:zip]) File.open("#{RAILS_ROOT}/zip_archive/zip_file.zip", "w") {|f| f.write encoded_data} unzip_file("#{RAILS_ROOT}/zip_archive/zip_file.zip", "#{RAILS_ROOT}/unzipped/") ...(using @file_path, do stuff) end def unzip_file (file, destination) destination = File.join(destination, File.basename(file, ".zip")) Zip::ZipFile.open(file) { |zip_file| zip_file.each { |f| f_path=File.join(destination, f.name) FileUtils.mkdir_p(File.dirname(f_path)) zip_file.extract(f, f_path) unless File.exist?(f_path) } } @file_path = destination end 

但是,我无法正确保存zip文件。 保存后的文件在解压缩部分给出错误。

 Zip::ZipError (Zip end of central directory signature not found): rubyzip (0.9.4) lib/zip/zip.rb:1287:in `get_e_o_c_d' rubyzip (0.9.4) lib/zip/zip.rb:1235:in `read_e_o_c_d' rubyzip (0.9.4) lib/zip/zip.rb:1260:in `read_from_stream' rubyzip (0.9.4) lib/zip/zip.rb:1392:in `initialize' rubyzip (0.9.4) lib/zip/zip.rb:1392:in `open' rubyzip (0.9.4) lib/zip/zip.rb:1392:in `initialize' rubyzip (0.9.4) lib/zip/zip.rb:1410:in `new' rubyzip (0.9.4) lib/zip/zip.rb:1410:in `open' app/controllers/pdf_controller.rb:37:in `unzip_file' app/controllers/pdf_controller.rb:13:in `get_pdf' 

当我试图在应用程序外打开文件时,该文件没有被打开说

 [/home/prince/Desktop/test_project/zip_archive/zip_file.zip] End-of-central-directory signature not found. Either this file is not a zipfile, or it constitutes one disk of a multi-part archive. In the latter case the central directory and zipfile comment will be found on the last disk(s) of this archive. zipinfo: cannot find zipfile directory in one of /home/prince/Desktop/test_project/zip_archive/zip_file.zip or /home/prince/Desktop/test_project/zip_archive/zip_file.zip.zip, and cannot find /home/prince/Desktop/test_project/zip_archive/zip_file.zip.ZIP, period. 

我尝试使用File.open("..", "wb")保存文件以二进制模式写入内容,但同样也会发生相同的错误。 在解码之前我应该​​对params[:zip]做什么吗?

奇迹般有效。 File#open块应该正确地写入和关闭文件,你可能只是在某处有错误的路径。 如果File.exists? 并且decode64经历了,你应该很好。

 ruby-1.9.2-p0 > zip = "UEsDBAoAAAAAAKphcT4AAAAAAAAAAAAAAAAFABwAZW1wdHlVVAkAA8/sgU3P\n7IFNdXgLAAEE9QEAAAQUAAAAUEsBAh4DCgAAAAAAqmFxPgAAAAAAAAAAAAAA\nAAUAGAAAAAAAAAAAAKSBAAAAAGVtcHR5VVQFAAPP7IFNdXgLAAEE9QEAAAQU\nAAAAUEsFBgAAAAABAAEASwAAAD8AAAAAAA==\n" ruby-1.9.2-p0 > File.open('test2.zip', 'wb') {|f| f.write(Base64.decode64(zip))} => 160 ruby-1.9.2-p0 > Zip::ZipFile.open('test2.zip') {|z| z.each {|f| puts f.name}} empty => [empty]