[英]Base64 encoded string to file(Ruby on Rails)
I have a requirement where a zip file is sent to the ROR application after encoding it with Base64 encoding. 我要求在使用Base64编码对zip文件进行编码后,将其发送到ROR应用程序。 I should decode it, save it as a zipfile and unzip it and do some operations.
我应该对其进行解码,将其另存为zip文件,然后将其解压缩并执行一些操作。 They are sending the zip file encoded data as a parameter called
zip
through POST method. 他们通过POST方法将zip文件编码的数据作为称为
zip
的参数发送。 Here, is what I have done in code. 这就是我在代码中所做的。
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
But, I am not able to save the zip file correctly. 但是,我无法正确保存该zip文件。 The file after saving is giving error on the unzipping part.
保存后的文件在解压缩部分出现错误。
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'
When I tried to open the file outside the app also, the file was not getting opened saying 当我也尝试在应用程序外部打开文件时,文件未打开说
[/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.
I tried saving the file with File.open("..", "wb")
to write the contents in the binary mode, but then also the same error occurs. 我尝试使用
File.open("..", "wb")
保存文件,以二进制模式写入内容,但是随后出现相同的错误。 Should I do anything to the params[:zip]
before decoding it? 在解码之前,我应该对
params[:zip]
做任何事情吗?
Works like a charm. 奇迹般有效。 The
File#open
block should properly write and close the file, you're probably just having the wrong path in there somewhere. File#open
块应该正确地写入和关闭文件,您可能只是在某处错误的路径。 If the File.exists?
如果
File.exists?
and the decode64 went through, you should be good. 解码器通过了,您应该很好。
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]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.