我关注了Heroku's tutorial on uploading straight to S3 with Rails并且工作正常,以便将新文件直接上传到Amazon S3,然后将保存的位置链接到我video_url
的{{1}}字段中模型。不幸的是,当我上传新文件时,旧文件不会在S3上从我的存储桶中删除。由于我正在上传视频文件,因此这并不理想。
我想知道如果成功添加新文件(Profile
模型更新),我将如何处理删除旧文件。我可以将其作为更新操作的一部分来执行,还是应该设置一个定期删除旧文件的工作程序?如果它是更新请求的一部分,我怎样才能在保存新位置后找到旧文件?对于工作人员,我如何能够针对特定替换的旧文件?
我未能找到任何建议的策略。我在教程中的相关代码包含在下面。我也在使用Profile
gem和jQuery-File-Upload 。
表格:
aws-sdk
_form.html.erb
财务主任的预先签署的帖子:
<%= simple_form_for @profile, html: { class: 'directUpload', data: { 'form-data' => (@s3_direct_post.fields), 'url' => @s3_direct_post.url, 'host' => URI.parse(@s3_direct_post.url).host } } do |f| %>
<%= f.input :video_url, as: :file, label: false %>
<hr>
<%= f.submit "Submit", class: "btn btn-info" %>
<% end %>
<!-- jQuery fileupload script for upload straight to s3 -->
<script>
$(function() {
$('.directUpload').find("input:file").each(function(i, elem) {
var fileInput = $(elem);
var form = $(fileInput.parents('form:first'));
var submitButton = form.find('input[type="submit"]');
var progressBar = $("<div class='bar'></div>");
var barContainer = $("<div class='progress'></div>").append(progressBar);
fileInput.after(barContainer);
fileInput.fileupload({
fileInput: fileInput,
url: form.data('url'),
type: 'POST',
autoUpload: true,
formData: form.data('form-data'),
paramName: 'file', // S3 does not like nested name fields i.e. name="user[avatar_url]"
dataType: 'XML', // S3 returns XML if success_action_status is set to 201
replaceFileInput: false,
progressall: function (e, data) {
var progress = parseInt(data.loaded / data.total * 100, 10);
progressBar.css('width', progress + '%')
},
start: function (e) {
submitButton.prop('disabled', true);
progressBar.
css('background', 'green').
css('display', 'block').
css('width', '0%').
text("Loading...");
},
done: function(e, data) {
submitButton.prop('disabled', false);
progressBar.text("Uploading done");
// extract key and generate URL from response
var key = $(data.jqXHR.responseXML).find("Key").text();
var url = '//' + form.data('host') + '/' + key;
// create hidden field
var input = $("<input />", { type:'hidden', name: fileInput.attr('name'), value: url })
form.append(input);
},
fail: function(e, data) {
submitButton.prop('disabled', false);
progressBar.
css("background", "red").
text("Failed");
}
});
});
});
</script>
profiles_controller.rb