【问题标题】:Modifying Carrierwave Direct filenames before upload上传前修改 Carrierwave Direct 文件名
【发布时间】:2014-07-28 22:39:28
【问题描述】:

我正在使用带有 S3 的 Carrierwave Direct 进行文件上传。

当文件上传到 S3 时,我们获取 S3 URL 并通过 FFMPEG 运行它以测量持续时间。

duration = `ffmpeg -i "#{post.s3_url}" 2>&1 | grep Duration | awk '{print $2}' | tr -d ,`

问题是,我们的一些用户在文件名中放置了特殊字符。

我看到 this post 展示了如何使用 Fog 重命名文件。但是,我想知道是否有更简单的方法...我很想在上传之前在 Carrierwave Direct 中对文件名进行硬编码。

我很好奇实现这一目标的最佳方法是什么。

感谢任何帮助!

【问题讨论】:

  • 你找到解决方案了吗?
  • 我发现你不能在上传前重命名,但是,使用Fog,你可以在上传后立即重命名。我在下面详细介绍了解决方案。

标签: ruby-on-rails ruby-on-rails-3 carrierwave


【解决方案1】:

您似乎无法在上传之前修改文件名。

最终的解决方案是允许文件(使用其原始文件名)上传到 S3,然后使用 Fog 进行复制、重命名,然后删除原始文件。

然后,我们将对文件的新版本运行 FFMPEG,并使用更新后的名称。

代码如下...

通过 Fog 打开与 S3 的连接...

connection = Fog::Storage.new({
  :provider => 'AWS',
  :aws_access_key_id => '[access key]', 
  :aws_secret_access_key => '[secret key]', 
})

选择文件所在的存储桶...

bucket = connection.directories.get('bucket_name')

选择您要重命名/复制的原始文件...

original_file = bucket.files.get 'path/to/filename.jpg'

复制原始文件,创建一个新文件——随意命名,然后公开...

new_file = bucket.files.create :key => 'path/to/newfilename.jpg', :body => original_file.body, :public => true

此时,我们已经复制了原始文件,并对其进行了重命名以避免与 FFMPEG 发生任何冲突。我们现在可以销毁原件了。

original_file.destroy

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多