Rails,在Heroku上直接上传到S3 - 在更新

时间:2017-02-04 00:38:55

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

我关注了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

0 个答案:

没有答案