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属性。所以每当我使用inputtype=“file”
我必须使用enctype=multipart/form data
,对吗?但是w3schools中的文件上载示例几乎从未在文件上载示例中使用过enctype
。那么,为什么它们没有包含强制性的enctype=multipart/form data
行,而如果没有它,服务器端处理将崩溃?我的意思是,服务器需要一个合适的文件,而不是一个文件名字符串。正如前面所说,W3Schools是clickbait垃圾,不幸的是,它在google上的排名很高。如果你想要一个合适的引用,请使用它。