【问题标题】:rails 3, heroku, aws-s3, simply trying to upload a file to S3 that is POSTed (http/multipart) to our apprails 3,heroku,aws-s3,只是尝试将文件上传到 S3,该文件已发布(http/multipart)到我们的应用程序
【发布时间】:2011-06-28 02:17:09
【问题描述】:

我们的应用托管在 Heroku,因此没有本地文件存储。

我们使用的第三方 api 不会存储它创建的 WAV,它会将文件 (http/multi-part) 发布回我们的应用程序。他们提供了示例代码来“简单地”将该文件发送到 S3。他们提供的代码(如下)不能在 Rails 3 + Heroku 上运行。我怀疑有一些不同的语法来指定我们从中读取的输入文件和临时文件。 (代码最初是为 Sinatra 编写的。我不知道旧的 [:filename][:tempfile] 是做什么用的,所以我删除了它们并猜测使用 Tempfile 的语法是这样的?)

  def post_audio_to_s3
    puts "*** POST_AUDIO_TO_S3 PARAMS:" + params.inspect

    con = AWS::S3::Base.establish_connection!(
      :access_key_id     => 'MYKEY',
      :secret_access_key => 'MYSECRET')

    puts "** CON='#{con.inspect}'"

    snd = AWS::S3::S3Object.store(params[:filename], 
                        Tempfile.open(params[:filename]).path, 
                        'bb_audios')
    puts "** SND='#{snd.inspect}'"

更新:几乎可以工作,但创建了零长度文件。我有点不知所措,不知道如何使用 Tempfile,但我在控制器类中添加了require 'tempfile',并将 S3 存储线修改为上述内容。

整个 POST-a-file 到 Heroku/Tempfile 的事情让我的大脑结冰了……任何想法都会受到赞赏。一方面......我不知道数据来自哪里......当我检查参数时,如果它被 POSTED 到应用程序,我不应该看到除了文件名之外的东西吗?

【问题讨论】:

    标签: ruby-on-rails file-upload amazon-s3 heroku


    【解决方案1】:

    它应该和HTML表单文件上传一样工作

    <form action="/post_audio_to_s3" method="post" enctype="multipart/form-data">
    <input type="file" id="file" name="file"/>
    <input type="submit" value="Upload"/>
    </form>
    

    首先尝试使用该表单测试您的操作。然后确保您的第三方 api 将文件作为多部分数据 HTML POST 提交给您。

    【讨论】:

    • 谢谢,但这完全不能解决问题......这是如何使用 heroku 上的临时文件来处理上传。
    • params[:filename] 应该是包含上传文件内容的临时文件的路径。打开它并传递给存储:AWS::S3::S3Object.store(params[:filename],File.open(params[:filename]))
    • 谢谢,但不,如果文件名是例如 1297842022.wav,则会给出错误 Errno::ENOENT(没有这样的文件或目录 - 1297842022.wav)。使用上面的 Tempfile(我不明白)至少在 S3 上创建一个文件,只是空的。
    • 更正:鉴于我上面的例子。 params[:file] 应该已经是一个可以传递给存储的 Tempfile 对象:AWS::S3::S3Object.store(params[:file].original_filename, params[:file])
    • 第三方api如何调用你的action?
    【解决方案2】:

    答案如下。我们必须将 url 参数从 filename= 更改为 myfilename=,因为 rails 魔术会自动将 'filename' 用于 POSTed 数据,因此它们在 params[] 中相互重叠。

    openme = params['filename'].tempfile.path
    
    snd = AWS::S3::S3Object.store(params[:myfilename], 
                            File.open(openme), 
                            'MYBUCKET')
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-27
      • 1970-01-01
      • 1970-01-01
      • 2012-02-22
      • 2014-07-28
      • 2017-12-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多