为什么 chunk 在 Erlang/ChicagoBoss 中读取文件时返回一些代码
Why chunk is returning some code while reading the file in Erlang/ChicagoBoss
除了 my old question,我们正在使用以下代码生成 XML:
download_xml('GET', [])->
Xml =generateXML(123445),
%% generated Xml data in string without any values 400,.etc
Filename = export_xml:get_file_name(?SESSION_ID1, ?SESSION_ID2),
Filepath = "./priv/static/" ++ Filename,
TotalSize = filelib:file_size(Filepath),
{ok, FP} = file:open(Filepath, [read]),
Generator = fun(FH) ->
case file:read(FH, 1024) of %% But this line is causing something that we never wanted.
eof -> file:close(FH),
done;
{ok, Data} ->
{output, Data, FH}
end
end,
{stream, Generator, FP, [
{"Content-Type", "application/force-download"},
{"Content-Disposition", "attachment; filename=" ++ Filename},
{"Content-length", TotalSize}
]}.
我们正在通过这一行使用 file:read(FH, 1024)
分块读取文件。但是这一行还在每个块中附加了一些数字 400
、400
、3b2
。我们观察到,这些代码只不过是每个块 的十六进制值 。
这是示例 XML :
sample.xml
400
<?xml version="1.0" encoding="UTF-8"?>.....</info><inf
400
tel>4444</tel>...<address></address>
3b2
<name> Abc</name><surname>EFg</surname><city>XYZ</city>....
</DATA>
0
因为,在将块大小从 1024
(即 file:read(FH, 2048)
)更改为 2048
时,值也会更改为 808
、365
、0
.
我们不理解的是:
- 当以块的形式流式传输文件内容时,每个块都在附加,它是 XML 中的(块的)大小,然后插入实际块。
这里是小的XML想要生成的有大小(93 Bytes
):
<?xml version="1.0">
<info>
<name> Abc</name>
<surname>EFg</surname>
<city>XYZ</city>
</info>
生成后我们得到的输出为:
5d
<?xml version="1.0">
<info>
<name> Abc</name>
<surname>EFg</surname>
<city>XYZ</city>
</info>
0
5d = 93 (Chunk size)
在这种情况下文件大小。
问题是:
- 为什么在使用生成器流式传输文件时,块在每个块之前附加大小?
注意 - 我们还尝试从代码中删除 header 列表 {"Content-length", TotalSize}
,但没有成功:(
我在 erlang 错误邮件列表中看到了一个与您的问题相关的交流:Misleading docs or implementation of file:read/2 and friends
使用 utf8 选项,file:read/2 的使用似乎不是 100% 干净。他们建议改用 io:read/3,但我不知道如何处理块和潜在的新行。
除了 my old question,我们正在使用以下代码生成 XML:
download_xml('GET', [])->
Xml =generateXML(123445),
%% generated Xml data in string without any values 400,.etc
Filename = export_xml:get_file_name(?SESSION_ID1, ?SESSION_ID2),
Filepath = "./priv/static/" ++ Filename,
TotalSize = filelib:file_size(Filepath),
{ok, FP} = file:open(Filepath, [read]),
Generator = fun(FH) ->
case file:read(FH, 1024) of %% But this line is causing something that we never wanted.
eof -> file:close(FH),
done;
{ok, Data} ->
{output, Data, FH}
end
end,
{stream, Generator, FP, [
{"Content-Type", "application/force-download"},
{"Content-Disposition", "attachment; filename=" ++ Filename},
{"Content-length", TotalSize}
]}.
我们正在通过这一行使用 file:read(FH, 1024)
分块读取文件。但是这一行还在每个块中附加了一些数字 400
、400
、3b2
。我们观察到,这些代码只不过是每个块 的十六进制值 。
这是示例 XML :
sample.xml
400
<?xml version="1.0" encoding="UTF-8"?>.....</info><inf
400
tel>4444</tel>...<address></address>
3b2
<name> Abc</name><surname>EFg</surname><city>XYZ</city>....
</DATA>
0
因为,在将块大小从 1024
(即 file:read(FH, 2048)
)更改为 2048
时,值也会更改为 808
、365
、0
.
我们不理解的是: - 当以块的形式流式传输文件内容时,每个块都在附加,它是 XML 中的(块的)大小,然后插入实际块。
这里是小的XML想要生成的有大小(93 Bytes
):
<?xml version="1.0">
<info>
<name> Abc</name>
<surname>EFg</surname>
<city>XYZ</city>
</info>
生成后我们得到的输出为:
5d
<?xml version="1.0">
<info>
<name> Abc</name>
<surname>EFg</surname>
<city>XYZ</city>
</info>
0
5d = 93 (Chunk size)
在这种情况下文件大小。
问题是:
- 为什么在使用生成器流式传输文件时,块在每个块之前附加大小?
注意 - 我们还尝试从代码中删除 header 列表 {"Content-length", TotalSize}
,但没有成功:(
我在 erlang 错误邮件列表中看到了一个与您的问题相关的交流:Misleading docs or implementation of file:read/2 and friends
使用 utf8 选项,file:read/2 的使用似乎不是 100% 干净。他们建议改用 io:read/3,但我不知道如何处理块和潜在的新行。