0

我正在尝试为用户编写一种非常简单的方法来将 html 文件添加到我的 Heroku 应用程序中。这些文件将保存在 ./log 中以供稍后渲染。我已经在本地测试了我的代码(在开发和生产中),但是当我尝试在我的 Heroku 托管存储库上上传文件时,我收到内部服务器错误 500。

控制器上传.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

查看上传文件.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

编辑:

如文章所述。

您的应用程序被编译成一个 slug,以便在测功机流形中快速分布。slug 的文件系统是只读的,这意味着您不能动态写入文件系统以进行半永久存储。不支持以下类型的行为:

  • 在公共目录中缓存页面
  • 将上传的资产保存到本地磁盘(例如,使用 attachment_fu 或回形针)
  • 使用 Ferret 编写全文索引
  • 写入文件系统数据库,如 SQLite 或 GDBM
  • 访问像 git-wiki 这样的应用程序的 git 存储库

有两个可写目录:./tmp 和 ./log(在您的应用程序根目录下)。如果您希望在请求期间临时删除文件,您可以写入像 #{RAILS_ROOT}/tmp/myfile_#{Process.pid} 这样的文件名。无法保证此文件在后续请求中会存在(尽管可能存在),因此不应将其用于任何类型的永久存储。

于 2012-08-07T14:50:27.190 回答