【问题标题】:Saving byteArray to pdf file in Titanium在 Titanium 中将 byteArray 保存为 pdf 文件
【发布时间】:2013-11-20 10:58:28
【问题描述】:

我有一个 SOAP API,它返回给我一个文件,该文件被分成多个 base64 字符串编码的块

我无法将其保存到文件系统而不破坏它

This is the pastebin 整个文件的编码,原样,一旦我下载并链接响应。

怎样才能正确保存呢?

我尝试了很多方法

var f = Ti.FileSystem.getFile(Ti.FileSystem.tempDirectory, 'test.pdf');

...

    var blobStream = Ti.Stream.createStream({ source: fileString, mode: Ti.Stream.MODE_READ });
    var newBuffer = Ti.createBuffer({ length: fileString.length });

    f.write(fileString);

    var data = Ti.Utils.base64decode(fileString);

    var blobStream = Ti.Stream.createStream({ source: data, mode: Ti.Stream.MODE_READ });
    var newBuffer = Ti.createBuffer({ length: data.length });
    var bytes = blobStream.read(newBuffer);

    f.write(fileString);

    var data = Ti.Utils.base64decode(fileString);

    var blobStream = Ti.Stream.createStream({ source: data, mode: Ti.Stream.MODE_READ });
    var newBuffer = Ti.createBuffer({ length: data.length });
    var bytes = blobStream.read(newBuffer);

    f.write(bytes);

但我不明白哪一个是正确的道路

我必须自己将字符串转换回 byteArray 吗? 什么是正确的保存方法?

我必须从字符串中创建缓冲区还是...?

【问题讨论】:

  • 在你所有的例子中你引用f,这是什么?一份文件?文件流?
  • 我编辑,我给它一个文件

标签: javascript titanium buffer filestream appcelerator


【解决方案1】:

我认为该文件的 base64enc 无效或不完整,我已经使用 bash 和 base64 工具对其进行了测试。您可以执行这些步骤。

将 base64 字符串复制并粘贴到名为 pdf.base64 的文件中,然后运行以下命令:

cat pdf.base64 | base64 --decode >> out.pdf

输出文件不是有效的 pdf。

您可以尝试对有效的pdf文件进行编码和解码以查看生成的二进制文件:

cat validfile.pdf | base64 | base64 --decode >> anothervalidfile.pdf

尝试检查您是否正确使用chainig块,或者只是与构建soap api的人打个电话。

【讨论】:

    【解决方案2】:

    在开始下载文件之前,您还需要创建要写入的 file 流,写入 blob 不是可行的方法:

    // Step 1
    var outFileStream = Ti.Filesystem.getFile('outfile.bin').open(Ti.Filesystem.MODE_WRITE);
    

    在创建 HTTPClient 或套接字流之后,当您从服务器接收到一大块 Base64 数据时,您需要将解码后的数据放入 Titanium.Buffer。这可能会进入您在 HTPPClient 中的 onload 或 onstream,:

    // Step 2
    var rawDecodedFileChunk = Ti.Utils.base64decode(fileString);
    var outBuffer = Ti.createBuffer({
        byteOrder : // May need to set this
        type :      // May also need to set this to match data
        value: rawDecodedFileChunk
    });
    

    终于可以将数据写入文件流了:

    // Step 3
    var bytesWritten = outFileStream.write(outBuffer);  // writes entire buffer to stream
    Ti.API.info("Bytes written:" + bytesWritten);  // should match data length
    if(outBuffer.length !== bytesWritten) {
        Ti.API.error("Not all bytes written!");
    }
    

    通常,错误来自错误的字节顺序或数据类型,或者以错误的顺序写入。显然,这一切都取决于服务器以正确的顺序发送数据并且它是有效的!

    您可能还需要考虑the pump command 版本,它允许您从输入流传输到输出文件流,从而最大限度地减少负载。

    【讨论】:

    • 谢谢你的完整问题,不幸的是写的方式很简单,错误在API中
    猜你喜欢
    • 2014-05-03
    • 1970-01-01
    • 2017-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-16
    • 1970-01-01
    相关资源
    最近更新 更多