2

我正在尝试使用示例代码上传文件。我没有收到任何编译错误,而是一条406 Not Acceptable错误消息。这是什么意思?

发布请求:

Started POST "/files/upload" for 10.15.24.38 at 2012-06-22 21:18:11 -0400
Processing by FilesController#upload as HTML
  Parameters: {"utf8"=>"â", "authenticity_token"=>"wfpBi3Y8KgmqitXrh4fZ3xfun73mWOfXiTQ+J7bdfWU=", "user_id"=>"231",
"button"=>"", "upload"=>{"datafile"=>"ws_1920x1080.jpg"}}

看法:

<%= form_tag files_upload_path, :remote => true, :method => :post, :multipart => true do %>
#The form has some other values too. I am keeping it short here.  
<p>
<label for="upload_file">Select File</label> :
<%= file_field 'upload', 'datafile' %>
</p>
<% end %>

控制器:

 def upload
    #The controller has some other values too, that are not related to file upload. 

    if params[:datafile]
    uploaded_io = params[:upload][:datafile]
    File.open(Rails.root.join('public', 'uploads', uploaded_io.original_filename), 'w') do |file|
    file.write(uploaded_io.read)
    end
    end

    if params[:user_id] 
    #do some extra stuff
    end 

    respond_to do |format|
    format.js
    end 

 end

错误:

Completed 406 Not Acceptable in 2736ms (ActiveRecord: 3.2ms)
4

3 回答 3

0

没有足够的信息来提供答案,但您:multipart => true在我们的form_for电话中显然缺少,如下所示:

<%= form_for @upload, :multipart => true do |f| %>
  Your form code here
<% end %>

并且发生了不可接受的错误,因为您要求进行 HTML 渲染,但可能没有任何respond_to内容响应 HTML。

于 2012-06-23T01:45:31.957 回答
0

ajax我猜你不能仅仅通过指定remote => true你需要某种插件或类似的东西来上传文件

remotipart, plupload,uploadify 或类似的东西。

因此,如果您没有使用任何插件,那么即使您指定remote => true表单也将作为普通 HTML 请求发送,而不是 XMLHttpRequest

现在因为在你的控制器中你已经删除了

format.html部分,因为您假设这将是一个ajax请求,但实际上它不是(HTML 请求)

因为 Rails 找不到合适的格式来回复它报告406 Not Acceptable

帮自己一个忙,将request.xhr?方法记录在控制器中。

就像是

logger.info "******************** #{request.xhr?} *********************"

如果request.xhr?返回nil指定该请求不是ajax 请求

于 2012-06-23T09:54:20.587 回答
0

您不允许(以直接方式)通过远程请求上传文件。看看这里:如何异步上传文件?

于 2012-06-23T08:58:17.783 回答