0

除了我的老问题,我们正在使用以下代码生成 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, 。我们观察到这些代码只不过是每个块的十六进制值。这是示例 XML:4003b2

示例.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

因为,在将块大小更改为2048from 1024 (ie file:read(FH, 2048)) 值时,也会更改为808, 365, 0

我们不理解的是: - 当以块的形式流式传输文件内容时,每个块都在附加,它是 XML 中的(块的)大小,然后插入实际的块。

这是想要生成大小 ( 93 Bytes) 的小 XML:

<?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)在这种情况下,文件大小。

问题是:

  • 为什么在使用生成器流式传输文件时块在每个块之前附加大小?

注意- 我们还尝试{"Content-length", TotalSize}从代码中删除标题列表,但没有奏效:(

4

1 回答 1

1

我在 erlang 错误邮件列表中看到了一个与您的问题相关的交换:误导文档或文件实现:read/2 和朋友

使用utf8选项似乎 file:read/2 的使用不是 100% 干净的。他们建议改用 io:read/3,但我不知道如何处理块和潜在的新行。

于 2015-01-29T14:46:08.967 回答