2

Rails アプリに別の Web サイトからファイルが入ってきます。POST データは次のようになります。

Parameters: {"file"=>#<ActionDispatch::Http::UploadedFile:0x007fa03cf0c8d0 @original_filename="Georgia.svg", @content_type="application/octet-stream", @headers="Content-Disposition: form-data; name=\"file\"; filename=\"Georgia.svg\"\r\nContent-Type: application/octet-stream\r\n", @tempfile=#<File:/var/folders/g0/m3jlqvpd4cbc3khznvn5c_7m0000gn/T/RackMultipart20130507-52672-1sw119a>>, "originalFileName"=>"Georgia.ttf"}

私のコントローラーコードはこれです:

def target     
  @incoming_file = params[:file]
  file_name = params[:originalFileName]
  File.open("/Users/my_home_directory/#{file_name}", "w+b") {|f| f.write(@thing)} 
end

現時点では、オブジェクトを示すテキスト行を含むファイルをハード ドライブに作成できます。

これは、ハード ドライブに作成されたファイルのコードです。

<ActionDispatch::Http::UploadedFile:0x007fa03cd1c318>

アップロードしたファイルの名前でファイルを書き込むことができます。ファイルからドライブにデータを書き込む方法がわかりません。Ruby on Railsは初めてです。私が欠けているものを見るのを手伝ってください。どうも。

4

2 に答える 2

14

明らかな解決策は Richie Min によって提案されたものですが、大きなファイルのアップロードを開始すると重大になる可能性がある、メモリ使用量の点で悪い解決策です。以来

File.open(...) {|f| f.write(@incoming_file.read)}

アップロードされたファイル全体をメモリ内で読み取ります@incoming_file.read。より良いオプションは次のとおりです。

def target
  @incoming_file = params[:file]
  file_name = params[:originalFileName]
  FileUtils.mv @incoming_file.tempfile, "/Users/my_home_directory/#{file_name}"
end

アップロードされたデータは常に一時ファイルに保存され、UploadedFile.read実際には実際の File オブジェクトへの単なるプロキシであり、 経由でアクセスできますUploadedFile.tempfile。ただし、一時フォルダと宛先ディレクトリが異なるパーティションまたは異なるディスク ドライブにある場合、これは最善の解決策ではない可能性がありますが、Rails コントローラーでメモリ内のファイル全体を読み取るよりははるかに優れています。

次の方法でテストできます。

curl -X POST -F file=@[some large file] -F originalFileName=somefilename.ext http://[your url]
于 2013-05-08T05:17:59.953 に答える
1

使用する

File.open("/Users/my_home_directory/#{file_name}", "w+b") {|f| f.write(@incoming_file.read)}

于 2013-05-08T03:25:39.270 に答える