0

ユーザーがHerokuアプリにhtmlファイルを追加するための非常に簡単な方法をコーディングしようとしています。これらのファイルは、後でレンダリングするために./logに保存されます。コードをローカルで(開発と本番の両方で)テストしましたが、Herokuでホストされているリポジトリにファイルをアップロードしようとすると、内部サーバーエラー500が発生します。

コントローラupload.rb:

class UploadController < ApplicationController
  def index
     render :file => 'upload/uploadfile.haml'
  end

  def uploadFile
    file_param = params[:upload][:datafile]
    post = DataFile.save(file_param)
    render :text => "File has been uploaded successfully"
  end
end

モデルdata_file.rb:

class DataFile < ActiveRecord::Base
  def self.save(upload)
    # Changed Default Destination: [__RAILS_DIR__/log]
    name = "./log/" + upload.original_filename

    # can haz data directory?
    require 'FileUtils'
    FileUtils.mkdir_p(File.dirname(name))


    File.open(name, "wb") { |f| f.write(upload.read) }
  end
end

uploadfile.hamlを表示:

%h1 File Upload
= form_for :upload,:url=>{:action => 'uploadFile'},:html => { :multipart => true } do |f|
  %p
    %label{:for => "upload_file"} Select File
    \:
    \#{f.file_field 'datafile'}
  = f.submit "Upload"

herokuログ:

2012-08-07T14:13:20+00:00 app[web.1]: Started POST "/uploadFile" for 69.29.117.99 at 2012-08-07 14:13:20 +0000
2012-08-07T14:13:20+00:00 app[web.1]: Processing by UploadController#uploadFile as HTML
2012-08-07T14:13:20+00:00 app[web.1]: Parameters: {"utf8"=>"✓", "authenticity_token"=>"1dAXkMulNR0d8S/l6QC8JnpSDtNBaHoyKJezgnheR10=", "upload"=>{"datafile"=>#>}, "commit"=>"Upload"}
2012-08-07T14:13:20+00:00 app[web.1]: Completed 500 Internal Server Error in 3ms
2012-08-07T14:13:20+00:00 app[web.1]: 
2012-08-07T14:13:20+00:00 app[web.1]: LoadError (no such file to load -- FileUtils):
2012-08-07T14:13:20+00:00 app[web.1]: app/models/data_file.rb:7:in save'
2012-08-07T14:13:20+00:00 app[web.1]: app/controllers/upload_controller.rb:8:inuploadFile'
2012-08-07T14:13:20+00:00 app[web.1]: 
2012-08-07T14:13:20+00:00 app[web.1]: 
2012-08-07T14:13:20+00:00 app[web.1]: cache: [POST /uploadFile] invalidate, pass

heroku: http: //upload-example.herokuapp.com/

github:https ://github.com/halterj1/upload

私の質問に答えないペーパークリップやキャリアウェーブを使用するように私を説得しようとしないでください。事前にみんなに感謝します、どんな助けでも大歓迎です!

4

1 に答える 1

0

herokuでこの記事を読む必要があります:https ://devcenter.heroku.com/articles/read-only-filesystem

編集:

記事に記載されているように。

アプリは、dynoマニフォールド全体に高速で配布するためにスラッグにコンパイルされます。スラッグのファイルシステムは読み取り専用です。つまり、半永久的なストレージのためにファイルシステムに動的に書き込むことはできません。次のタイプの動作はサポートされていません。

  • パブリックディレクトリのページのキャッシュ
  • アップロードしたアセットをローカルディスクに保存する(例:attachment_fuまたはpaperclipを使用)
  • Ferretを使用したフルテキストインデックスの作成
  • SQLiteやGDBMなどのファイルシステムデータベースへの書き込み
  • git-wikiなどのアプリのgitリポジトリにアクセスする

書き込み可能なディレクトリは、。/tmpと./log(アプリケーションルートの下)の2つです。リクエスト中に一時的にファイルをドロップしたい場合は、#{RAILS_ROOT}/tmp/myfile_#{Process.pid}のようなファイル名に書き込むことができます。このファイルが後続のリクエストで存在するという保証はありません(存在する可能性はありますが)。したがって、これをいかなる種類の永続ストレージにも使用しないでください。

于 2012-08-07T14:50:27.190 に答える