我正在尝试提取上传的zip文件并将其内容存储在数据库中,每个文件一个条目.rubyzip库几乎没有有用的文档.
有一个资产表,其中包含键:字符串(文件名)和数据:二进制文件(文件内容).
我正在使用rubyzip库,并且已经做到了这一点:
Zip::ZipFile.open(@file_data.local_path) do |zipfile|
zipfile.each do |entry|
next if entry.name =~ /__MACOSX/ or entry.name =~ /\.DS_Store/ or !entry.file?
asset = self.assets.build
asset.key = entry.name
asset.data = ?? # what goes here?
end
end
Run Code Online (Sandbox Code Playgroud)
如何设置ZipEntry中的数据?我必须使用临时文件吗?
我想知道使用rubyzip压缩数据与使用本机os库执行压缩时的性能差异.我从URL获取要压缩的数据,然后使用ZipOutputStream创建zip文件.在本机OS实用程序的情况下,我正在考虑使用zip工具.很高兴听到两种方法的优点和缺点.
我知道如何使用rubyzip检索普通zip文件的内容.但是我解压缩拉链文件夹的内容时遇到了麻烦,我希望你们中的任何人都可以帮助我.
这是我用来解压缩的代码:
Zip::ZipFile::open(@file_location) do |zip|
zip.each do |entry|
next if entry.name =~ /__MACOSX/ or entry.name =~ /\.DS_Store/ or !entry.file?
logger.debug "#{entry.name}"
@data = File.new("#{Rails.root.to_s}/tmp/#{entry.name}")
end
end
Run Code Online (Sandbox Code Playgroud)
entry.name为我提供了zip文件中文件的名称.这与普通的zipfile完美配合.但是当从文件夹创建zipfile时,条目的名称类似于:test-folder/test.pdf.当我然后尝试创建该文件时,它告诉我无法找到该文件.这可能是因为它位于拉链内的"测试"文件夹内.
如果我将条目检查为文件夹,则无法找到任何文件夹.所以我认为解决方案是将条目作为流读取,然后将其另存为文件.很容易获得入门流,但如何将其保存为文件?这是我到目前为止所得到的.
Zip::ZipFile::open(@file_location) do |zip|
zip.each do |entry|
next if entry.name =~ /__MACOSX/ or entry.name =~ /\.DS_Store/ or !entry.file?
logger.debug "#{entry.name}"
@data = entry.get_input_stream.read
# How do i create a file from a stream?
end
end
Run Code Online (Sandbox Code Playgroud)
基本上我的问题是:如何从流创建文件?还是比我的更方便?
===编辑===我用paperclip来存储文件.
我在rails网站上有一个ruby(rails 2.0.2,ruby 1.8.6),同时安装了rubyzip和zipruby,但它们在File.exists上有冲突吗?方法所以我想删除一个.关于最好的压缩api前进的普遍共识是什么?
一个是否有显着的优势?
我如何在rails上的ruby中压缩目录?我试过rubyzip没有成功.我不需要单独压缩dir的内容只是压缩dir本身.
考虑一下,我们有以下目录结构:
Location:
/Users/me/Desktop/directory_to_zip/
dir1 dir2 somefile.txt
Run Code Online (Sandbox Code Playgroud)
现在,如果我使用rubyzip压缩directory_to_zip使用以下代码的内容:
directory = '/Users/me/Desktop/directory_to_zip/'
zipfile_name = '/Users/me/Desktop/recursive_directory.zip'
Zip::File.open(zipfile_name, Zip::File::CREATE) do |zipfile|
Dir[File.join(directory, '**', '**')].each do |file|
zipfile.add(file.sub(directory, ''), file)
end
end
Run Code Online (Sandbox Code Playgroud)
这将创建一个名为 的 zip 文件recursive_directory.zip,其中将包含一个名为directory_to_zip& inside的容器目录directory_to_zip,我会找到我的 files( dir1 dir2 somefile.txt)
我如何跳过directory_to_zipinside 的创建recursive_directory.zip,以便 zip 文件只包含directory_to_zip& 而不是目录本身的内容。
实际上我的要求是将一些文件压缩到一些文件夹中。我已经在我的服务器上保存了许多文件并与一些对象关联。所以我必须压缩与一个对象相关的所有文件,如下所示:
这是我的层次结构的一个示例。我所做的是创建这些文件夹,复制这些文件夹中的文件,并使用以下代码创建 zip:
在 rubyzip 库本身上找到。但是,当我在 Windows 上解压缩此文件并在 Microsoft Excel 中打开它时,出现以下错误:
我们发现“FileName.xlsx”中的某些内容存在问题。您希望我们尽力恢复吗?如果您信任此工作簿的来源,请单击“是”
按“是”可以恢复文件,但我不知道为什么会出现此错误。我尝试在将 Excel 文件复制到工作正常的服务器上时打开该文件,但是一旦压缩并解压缩该文件,就会出现错误。我已经看到了该主题的一些不同问题,例如:
由 rubyzip 压缩的 xlsx 无法被 Excel 读取
但没有得到帮助。
我尝试做的更多事情就是设置压缩级别,并尝试将其设置为Zlib::DEFAULT_COMPRESSIONrubyzip,但尽管如此,我还是遇到了同样的问题。另外,在某些地方,甚至在自述文件中,如果 rubyzip 我发现我们可以使用:
改用
write_bufferopen
我在这条线上尝试了它(我能找到的最好的):
但它给了我一个不同的例外,所以如果这是解决方案,我不知道如何使用它。
I'm reading a lot of zip file with rubyzip.
However this error message is always showing in only specific file even it is zip file.
/app/vendor/bundle/ruby/2.3.0/gems/rubyzip-1.2.1/lib/zip/central_directory.rb:143:in `get_e_o_c_d': Zip end of central directory signature not found (Zip::Error)
I guess this error occures in rubyzip.
How can I manage this error?
Here is my code.
url = 'http://example.zip'
zipfilename = open(url)
Zip::File.open(zipfilename, :allow_redirections => :all) do |zip_file|
entry = zip_file.glob("*ixbrl.htm").first
stream = entry.get_input_stream.read
puts stream
end
Run Code Online (Sandbox Code Playgroud)
Thank you!
我正在使用此处描述的技术创建一个zip文件:
http://info.michael-simons.eu/2008/01/21/using-rubyzip-to-create-zip-files-on-the-fly/
客户端已要求我在此zip文件中包含子目录.我搜索了ZipOutputStream文档但我看不到包含目录的方法.有没有办法用ZipOutputStream做到这一点?我应该使用与ZipOutputStream不同的类吗?
此外,我正在压缩的文件不在本地文件系统上,而是存储在云服务中.
我正在寻找一种方法来创建多个csv文件,并在我的rails应用程序中的一个请求中将它们下载为一个zip存档.
要构建存档,我使用rubyzip gem - 只下载rails内置函数send_data.我遇到的问题是rubyzip的add-function需要一个路径名来加载文件.但是没有路径,因为我的csv文件是在同一个请求中创建的.
一些代码:
# controller action to download zip
def download_zip
zip = @company.download_all
send_data zip, filename: "abc.zip", type: 'application/zip'
end
# method to create zip
def download_all
Zip::File.open('def.zip', Zip::File::CREATE) do |zipfile|
self.users.each do |user|
#some magic to combine zipfile.add() and user.to_csv
end
end
end
# method to create csv
def to_csv
CSV.generate do |csv|
#build awesome csv
end
end
Run Code Online (Sandbox Code Playgroud)
有没有办法临时保存我的csv文件在某个目录,我可以将路径名传递给zipfile.add()?
好周末大家和快乐的编码!