2012-11-08 45 views
2

我想上傳一個zip文件使用rails回形針寶石,到目前爲止它工作正常。 但是下載完成後,我想解壓這個文件,並用裏面的文件做一些事情。Rails - 用回形針和unziping上傳zip文件

當我嘗試解壓文件時出現問題,因爲它不在它自己的路徑中,可能它正在被複制但沒有完成。 (我在本地主機,在線模式下更糟糕)。

所以,我需要某種事件/觸發器來知道文件何時完成上傳才能開始unziping。同時,展示某種界面。 這個控制器裏的代碼低於:

如果
# POST /components 
# POST /components.json 
def create 
    @component = Component.new(params[:component]) 

    file = @component.folder 

    Zip::ZipFile.open(file.path) do |zipfile| # <-- The error comes here 
    zipfile.each do |file| 
     # do something with file 
    end 
    end 


    respond_to do |format| 
    if @component.save 
     format.html { redirect_to @component, notice: 'Component was successfully created.' } 
     format.json { render json: @component, status: :created, location: @component } 
    else 
     format.html { render action: "new" } 
     format.json { render json: @component.errors, status: :unprocessable_entity } 
    end 
    end 
end 
+0

[This blog post](http://lovehateubuntu.blogspot.com/2008/12/rails-and-processing-uploaded-zip-files.html)可能是相關的。簡而言之,您可能無法獲得您所期望的實際文件。 – mlt

回答

0

不知道這會幫助,因爲我用回形針掙扎自己但在這裏不用。

我希望保存方法被調用並完成後,文件將被保存。我建議你在保存方法後對文件調用其他操作。

希望它有幫助。

1

這是一個解壓縮函數,可能對您的情況有所幫助,看看它是否適合您。

DEF create_photos_from_zip logger.debug 「create_photos_from_zip - >」 拉鍊=參數[:拉鍊] logger.debug 「解壓縮文件#{zip.path}類別#{zip.class}」

dir = File.join(RAILS_ROOT,"public","events","temp",current_user.name) 
FileUtils.mkdir_p(dir) 
Zip::ZipFile.open(zip.path).each do |entry| 
    # entry is a Zip::Entry 
    filename = File.join(dir,entry.name) 
    logger.debug "will extract file to #{filename} to" 
    entry.extract(filename) 
    p = File.new(filename) 
    photo = Photo.create(:photo=>p) 
    photo.title = "nova imagem" 
    @event.photos << photo 
    p.close 
    FileUtils.remove_file(filename) 
end 
#delete zip file 
logger.debug "closing/deleting zip file #{zip.path}" 
zip.close 
FileUtils.remove_file(zip.path) 
logger.debug "saving the event to database" 
logger.debug "create_photos_from_zip <--" 

end