サーバーで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のドキュメントから私が完全に理解していないことの1つは、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:
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]]
フラッシュドロップCookieに関していくつかの問題があることは知っていますが、作成アクションでの信頼性トークンのチェックをスキップすることで、デバッグ目的でこれを回避したと思います。アップロードフォルダのセキュリティ権限をワールド読み取り/書き込みに変更しました。github Carrierwaveのドキュメントで遭遇したもう1つの混乱は、次のコードです。
u.avatar = File.open('somewhere')
これは必要ですか?もしそうなら、なぜそしてそれは何をしますか?
助けていただければ幸いです。ありがとう!