Ruby on rails 标识为字符串而不是文件的参数

Ruby on rails 标识为字符串而不是文件的参数,ruby-on-rails,forms,file-io,http-method,Ruby On Rails,Forms,File Io,Http Method,在我的视图文件submit.html.erb中,我决定直接使用标记,而不是rails附带的表单助手。以下是查看文件: <form action = "/winter" method="post"> <input type="file" name="doc"> <p> Upload your question. </p> <input type = "submit"> <input name="authenticity_token

在我的视图文件
submit.html.erb
中,我决定直接使用
标记,而不是rails附带的表单助手。以下是查看文件:

<form action = "/winter" method="post">
<input type="file" name="doc">
<p> Upload your question. </p>
<input type = "submit">
 <input name="authenticity_token" type="hidden" 
      value="....">
</form>
虽然我希望
doc
参数是我上传的文件
1.docx
,但
doc
参数仍然是文件
1.docx
的字符串
原始文件名

我的
routes.rb
文件包含代码

post "/winter" => "paper#submit"
而在paper_controller的提交方法中是代码:

File.write("Papers/rain.docx", params[:doc].read)
redirect_to "/paper"
相应地,当我提交上述表单时,我转到
/winters
url并得到错误信息

“1.docx”的未定义方法“read”:字符串

那么为什么将
doc
参数设置为文件名而不是文件本身呢?我想这与文件相反:[

还有一点可能与此相关,那就是,在doc的第一段中,它说:

根据上传文件的大小,它实际上可能是StringIO或由临时文件支持的文件实例

那么,是不是说有时候
params[:doc]
可能是一个文件实例,有时候可能是一个字符串?如何处理这种随机行为

还有一件事,如果我尝试
get
request而不是
put
request怎么办?
get
必须将参数放在url后面,作为查询字符串,对吗?那么
params[:doc]
应该始终是字符串吗?我尝试使用
get
,并被发送到url

http://localhost:3000/winter?doc=1.docx
(当时我没有使用
authenticity令牌
params'隐藏输入)。 当然,也是一样

“1.docx”的未定义方法“read”:字符串

出现错误。

您必须使用才能进行文件传输。这对于任何web框架都是正确的

我建议您只使用表单帮助器,因为它将添加正确的真实性令牌:

<%= form_tag("/winter", multipart: true) do %>
  <%= file_field_tag 'doc' %>
  # ...
<% end %>

# ...
还有一件事,如果我尝试获取请求而不是放置呢 request?get必须将参数作为查询放在url后面 字符串,对吗?那么params[:doc]应该一直是字符串吗?我试过了 使用get,并已发送到url

http://localhost:3000/winter?doc=1.docx
无法在GET请求中上载文件。这些文件必须包含在使用multipart/formdata编码的POST/PATCH/PUT请求的请求正文中


文件是二进制的-用于在GET请求中传递数据的查询字符串只是一个包含formdata键/值对的字符串。因此,要在GET请求中传递文件,您需要对其进行base64编码,这会使文件大小增大约30%。许多浏览器还限制URI的长度,就像某些web服务器一样,以防止DOS攻击,从而使这真是个糟糕的主意。

[说“只有当method=“post”和
application/x-www-form-urlencoded
enctype
属性的默认值时,才能使用enctype属性。所以每当我使用input
type=“file”
我必须使用
enctype=multipart/form data
,对吗?但是w3schools中的文件上载示例几乎从未在文件上载示例中使用过
enctype
。那么,为什么它们没有包含强制性的
enctype=multipart/form data
行,而如果没有它,服务器端处理将崩溃?我的意思是,服务器需要一个合适的文件,而不是一个文件名字符串。正如前面所说,W3Schools是clickbait垃圾,不幸的是,它在google上的排名很高。如果你想要一个合适的引用,请使用它。