2016-04-24 89 views
2

在控制器奇怪的行为,我有这样的事情:关于渲染文件的大小

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(data)呈现为API用户正确的ini文件(1.5MB)。我们的客户需要添加Content-Length标题。原因并不重要。

当我尝试:

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。设置Content-Length后,渲染文件为1.2MB。内容被削减。

如果有人能说出原因,我将不胜感激。

+1

如果你使用curl,你还会得到相同的截断结果吗?是否通过curl标题中的“Content-Length”也如您所期望的那样? –

回答

5

看起来你在文件中有需要存储超过1个字节的字符。你应该使用方法bytesize而不是size。

您可以找到您使用大小而不是字节大小的问题示例here。大小返回字符数,但您希望bytesize方法返回的字节数。

UTF-8使用1到4个字节来存储字符。

+0

非常感谢,正确的方法 –

+0

但'size'是File对象上的一个方法,而不是String对象,所以它不应该返回字符数,而是字节数,不是?什么*是* SomeClass.make_ini返回? –

+0

我会说它会返回一个以.ini格式呈现的字符串。所以文件变量不是文件,而是返回文件.ini内容的字符串。我会说你需要发送一个字符串到渲染功能,而不是一个文件。 –

2

假设SomeClass.make_ini返回Ruby的File类的一个实例,其size方法应返回的字节数,而不是字符数:

:001 > File.write('japanese.txt', "ルビー") 
=> 9 
:002 > file = File.new('japanese.txt') 
=> #<File:japanese.txt> 
:003 > file.size 
=> 9 

难道你要设置的内容类型响应头?