Ruby on rails 渲染文件的奇怪行为';s码
在控制器中,我有如下内容:Ruby on rails 渲染文件的奇怪行为';s码,ruby-on-rails,ruby,Ruby On Rails,Ruby,在控制器中,我有如下内容: respond_to do |format| format.ini do response.headers['Content-Disposition'] = "attachment; filename=somefile.ini" render ini: SomeClass.make_ini(data) end end SomeClass.make_ini(数据)为API用户呈现正确的ini文件(1.5MB)。我们的客户要求添加内容长度标题。原
respond_to do |format|
format.ini do
response.headers['Content-Disposition'] = "attachment; filename=somefile.ini"
render ini: SomeClass.make_ini(data)
end
end
SomeClass.make_ini(数据)
为API用户呈现正确的ini文件(1.5MB)。我们的客户要求添加内容长度
标题。原因不重要
当我尝试时:
respond_to do |format|
format.ini do
file = SomeClass.make_ini(data)
response.headers['Content-Length'] = file.size.to_s
response.headers['Content-Disposition'] = "attachment; filename=somefile.ini"
render ini: file
end
end
file.size.to_s
带来1301761
。设置内容长度后,渲染文件为1.2MB。内容也被删减了
如果有人能告诉我原因,我将不胜感激。文件中似乎有需要存储超过1字节的字符。您应该使用bytesize而不是size方法
您可以使用size而不是bytesize找到问题的示例。size返回字符数,但需要bytesize方法返回的字节数
UTF-8使用1到4个字节来存储字符。假设SomeClass.make_ini
返回Ruby的文件类的实例,其size
方法应返回字节数,而不是字符数:
:001 > File.write('japanese.txt', "ルビー")
=> 9
:002 > file = File.new('japanese.txt')
=> #<File:japanese.txt>
:003 > file.size
=> 9
:001>File.write('japanese.txt',”ルビー")
=> 9
:002>file=file.new('japanese.txt')
=> #
:003>文件大小
=> 9
是否必须在响应标头中设置内容类型?如果使用curl,是否仍会得到相同的截断结果?通过curl在标头中设置的内容长度是否也与您预期的一样?但是size
是文件对象的方法,而不是字符串对象,因此它不应返回字符数,但不是字节数,不是吗?SomeClass.make_ini返回的是什么?我想说它返回的是一个以.ini格式呈现的字符串。因此,file变量它不是一个文件,而是一个包含返回的.ini文件内容的字符串。我想说,您需要向呈现函数发送一个字符串,而不是一个文件。@ArtyomKalmykov请告诉我们是什么SomeClass返回的对象的类。make_ini?根据返回的大小以及bytesize如何解决问题…我认为很明显这是一个字符串。是的,这是字符串。