我在SO上搜索了一个答案,所以我确信以前没有问过这个问题。请帮助我,救世主!
我正在尝试使用s3_direct_upload gem来处理直接上传到S3的文件,但我只是不知道如何查看/使用/保存显然是从S3服务器返回的数据。我已经阅读了s3_direct_upload的README十几次了,它给出了JS代码的一些示例片段,但没有告诉我代码应该去哪里。
我已经完成了README的第一部分并设置了AWS配置和简单的jQuery
jQuery ->
$("#s3-uploader").S3Uploader()
在我的CoffeeScript中(正确包含在资产管道中)。
我认为这是:
<%= s3_uploader_form callback_url: work_path, callback_param: "work[url]", class: "s3-uploader" do %>
<%= file_field_tag :file, multiple: false %>
<% end %>
<%= form_for(@work) do |f| %>
<%= f.label :name, "Title" %>
<%= f.text_field :name %>
<%= f.label :category, "Category" %>
<%= f.text_field :category %>
<br>
<%= f.submit "Upload", id: "btn-upload-work", class: "btn btn-large btn-warning btn-upload" %>
<% end %>
我希望用户上传work
并填写一些字段。当用户点击"Upload"
按钮时,应创建一个新的work
,其中属性:url
等于上传文件的网址,以及:name
和{{ 1}}属性等于用户输入的文本。然后页面应重定向到提交的作品的:category
页面。 README给出了这个例子:
show
但我不知道在哪里放这些代码。
这是我的控制器:(我知道$('#myS3Uploader').bind "s3_upload_complete", (e, content) ->
$('#someHiddenField').val(content.url)
操作需要更改,但我不确切知道是什么。我已经用create
进行了几个小时的实验而无济于事。)
respond_to
即使阅读了README十几次之后,我仍然不明白def show
@work = Work.find(params[:id])
end
def new
@work = Work.new
end
def create
@work = current_user.works.new(work_params)
if @work.save
flash[:success] = "Work successfully submitted!"
redirect_to @work
else
render 'new'
end
end
private
def work_params
params.require(:work).permit(:name, :category, :url)
end
到底是什么,callback_url
是什么,以及如何使用它们。更糟糕的是,加载此视图会出错--Rails不喜欢callback_param
部分。我不得不将其更改为callback_url: work_path
以加载它,但我不确定这是否正确(因为我不理解work_path(@work)
)。
从其他人询问的有关s3_direct_upload的问题来看,似乎他们已经知道如何使用它(问题只是较小的细节)。所以我迷失了,因为我甚至无法让它在第一时间起作用。我对网络前端有点新意,所以请耐心等待我解释一下。非常感谢!
答案 0 :(得分:3)
我仍然不明白callback_url到底是什么,
callback_url
是在gem完成将文件上传到s3后通过AJAX发布的路径。所以work_path(@work)
应该没问题。
$('#myS3Uploader')。bind“s3_upload_complete”,(e,content) - &gt;
$('#someHiddenField')。val(content.url)但我不知道在哪里放这些代码。
您可以将上述代码放在放置$("#s3-uploader").S3Uploader()
的同一个coffeescript文件中。将$('#someHiddenField').val(content.url)
替换为alert(content.url)
。这样,如果上传成功,您将收到警报消息。
还将以下代码粘贴到相同的coffeescript文件
中$('#myS3Uploader').bind "s3_upload_failed", (e, content) ->
alert("#{content.filename} failed to upload : #{content.error_thrown}")
如果出现错误,上面的代码会显示警告。
如果在提交文件后没有看到任何两个,那么还有一些其他问题。我强烈建议您使用firebug。它在调试客户端javascript函数时非常有用。在firebug网络面板中,您可以看到gem是否正在调用s3服务器。它还会在控制台面板中显示任何javascript错误。