我正在尝试在服务器上使用 Carrierwave 并在客户端上使用 Uploadify 来实现上传器。从客户端来看,它似乎一切正常,在服务器上,记录保存在数据库中,但物理上传的文件永远不会保存到文件系统中。请记住,我是 Rails 的新手。
这是我的上传者:
class ShapefileUploader < CarrierWave::Uploader::Base
storage :file
# simple path for debugging
def store_dir
"uploads"
end
end
我的模型:
class DataRecord < ActiveRecord::Base
# not too sure if this belongs here at all, documentation is not too specific.
require 'carrierwave/orm/activerecord'
mount_uploader :shapefile, ShapefileUploader
end
我从 Carrierwave 文档中没有完全理解的一件事是关于确保在加载 ORM 后加载 CarrierWave 的部分。我不完全明白它的意思。
我的控制器:
class DataRecordsController < ApplicationController
skip_before_filter :verify_authenticity_token, :only => [:update, :create]
def index
@folder = Folder.find(params[:folder_id])
@data_types = DataType.all
end
def create
data_record = DataRecord.new({:shapefile => params[:Filedata], :folder_id => params[:folder_id], :user_file_name => params[:Filename], :data_type_id => 6})
data_record.save!
end
def update
end
end
在创建操作中,除了实际文件上传我手动设置用于调试的其余数据。
这一切似乎都没有任何错误。
这是发布的数据:
Parameters: {"Filename"=>"id_rsa.pub", "Filedata"=>#<ActionDispatch::Http::UploadedFile:0x007fc67836eb88 @original_filename="id_rsa.pub", @content_type="application/octet-stream", @headers="Content-Disposition: form-data; name=\"Filedata\"; filename=\"id_rsa.pub\"\r\nContent-Type: application/octet-stream\r\n", @tempfile=#<File:/tmp/RackMultipart20120531-4919-147n4qu>>, "Upload"=>"Submit Query", "folder_id"=>"74"}
SQL插入:
INSERT INTO "data_records" ("data_type_id", "folder_id", "shapefile", "status", "uploaded_date_time", "user_file_name", "validated", "validation_results", "validation_to_send") VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9) RETURNING "id" [["data_type_id", 6], ["folder_id", 74], ["shapefile", "id_rsa.pub"], ["status", 0], ["uploaded_date_time", nil], ["user_file_name", "id_rsa.pub"], ["validated", 0], ["validation_results", nil], ["validation_to_send", nil]]
我知道在 Flash 丢弃 cookie 方面存在一些问题,但我认为我已经通过在创建操作上跳过检查真实性令牌来解决此问题以进行调试。我已将上传文件夹的安全权限更改为世界读/写。我在 github Carrierwave文档中遇到的另一个困惑是以下代码:
u.avatar = File.open('somewhere')
这是必需的吗?如果是这样,为什么以及它的作用是什么?
帮助将不胜感激。谢谢你!