我正在使用lib jQuery-File-Upload在我的aws s3存储桶上传文件。 我的问题是我想在上传之前重命名我的文件,因为如果文件名上有特殊字符,aws返回的url不正确,我无法在控制器rails中打开它。
有没有办法覆盖lib中的一个函数来重命名文件?
谢谢,
答案 0 :(得分:2)
在遵循Heroku教程后,我遇到了类似的挑战。我想从文件名中删除空格,并根据当前项目添加文件夹前缀。为了在上传到S3之前更改文件名,我添加了submit callback,我在客户端修改了名称。
fileInput.fileupload({
...
submit: function (e, data) {
// Get the original filename
var fileName = data.originalFiles[0].name
// Get the prefix from the form
var keyPrefix = form.data('key-start')
// Combine the prefix and the original filename with start/end whitespace removed
var fullFileName = keyPrefix + fileName.trim();
// Replace whitespaces with underscores
// At this step you could replace other special characters as well
var newFileName = fullFileName.replace(/\s+/g, '_');
// Update the form data with the new key value
$(form.data('form-data')).attr("key", newFileName);
// Set the form data
data.formData = form.data('form-data');
},
...
});
由于我更改了文件名,我需要确保S3也知道。教程建议控制器key
方法中的set_s3_direct_post
值为:
key: "uploads/#{SecureRandom.uuid}/${filename}"
key
方法要求文件名与创建帖子网址时提供的文件名相匹配(因为我没有使用动态${filename}
值,因此我不会这样做在创建直接发布URL以指定它时,不知道最终文件名。我使用key_starts_with
方法,以便我可以指定项目文件夹前缀(删除空格),S3只会评估匹配项:
key_starts_with: "#{(current_project.name).strip.split(' ').join('_')}/"
我的最终set_s3_direct_post
方法是:
def set_s3_direct_post
@s3_direct_post = S3_BUCKET.presigned_post(key_starts_with: "#{(current_project.name).strip.split(' ').join('_')}/", success_action_status: '201', acl: 'public-read')
end
有关key_starts_with
的更多详情,请参阅AWS SDK for Ruby。
供参考,这是我的表格,其中添加了key-start
数据值:
<%= simple_form_for @asset, html: {class: 'directUpload new_asset', data: { 'form-data' => (@s3_direct_post.fields), 'key-start' => "#{current_project.name}/#{SecureRandom.hex(4)}_" , 'url' => @s3_direct_post.url, 'host' => URI.parse(@s3_direct_post.url).host } } , :url => project_assets_path(current_project) do |f| %>
<%= f.input :name %>
<%= f.input :file, as: :file %>
<%= f.button :submit, "Add File", class: "addFileButton" %>
<% end %>
在我的情况下,我只是将它用于单个文件上传,并且只想确保从文件名中删除空格(我是此上传表单的两个用户之一,因此特殊字符或其他文件名问题不是&# 39;关心)。
答案 1 :(得分:0)
在add:callback中,将“key”的s3签名从“/ somefolder / $ {filename}”更改为“/ somefolder / your-new-name”
s3_signatures = {
key: '/somefolder/${filename}',
…
}
$('.fileupload').fileupload({
url: url,
type: 'POST',
formData: s3_signatures, // adding signature for S3
add: function(e, data){
s3_signatures['key'] = '/somefolder/your-new-name';
data.formData = s3_signatures;
data.submit();
} …