nativescript 保存 blob 错误无法将对象转换为 [B at index 1

Posted

技术标签:

【中文标题】nativescript 保存 blob 错误无法将对象转换为 [B at index 1【英文标题】:nativescript saving a blob error Cannot convert object to [B at index 1 【发布时间】:2020-08-27 18:06:11 【问题描述】:

我有一个 Nativescript Angular 应用程序,它从 Rails 服务器以 Blob Uint8Array 格式下载 pdf,当我尝试保存它时,我收到以下错误;

JS: /data/user/0/com.asset.management/files/result.pdf
JS: ERROR Error: Uncaught (in promise): Error: Cannot convert object to [B at index 1
JS: Error: Cannot convert object to [B at index 1
JS:     at file: node_modules/@nativescript/core/file-system/file-system-access.android.js:215:0
JS:     at new ZoneAwarePromise (file: node_modules/nativescript-angular/zone-js/dist/zone-nativescript.js:902:0)
JS:     at FileSystemAccess.push.../node_modules/@nativescript/core/file-system/file-system-access.js.FileSystemAccess.writeAsync (file: node_modules/@nativescript/core/file-system/file-system-access.android.js:213:0)
JS:     at file: node_modules/@nativescript/core/file-system/file-system.js:240:0
JS:     at new ZoneAwarePromise (file: node_modules/nativescript-angular/zone-js/dist/zone-nativescript.js:902:0)
JS:     at File.push.../node_modules/@nativescript/core/file-system/file-system.js.File.write (file: node_modules/@nativescript/core/file-system/file-system.js:231:0)
JS:     at SafeSubscriber._next (file: src/app/assets/assets.component.ts:92:25)
JS:     at SafeSubscriber.push.../node_modules/rxjs/_esm5/internal/Subscriber.js.SafeSubscriber.__tryOrUn...

这里是代码;

        this.http.get(url,  responseType: 'blob' )
            .subscribe(data => 

                const documentsFolder = knownFolders.documents();
                const destination = path.join(documentsFolder.path, 'result.pdf');
                const file = File.fromPath(destination);

                file.write(data);
                this.pdfUrl = file.path;
            );

我正在尝试保存文件,以便我可以使用 nativescript-pdf-view 插件查看它

更新:检查文件系统

我已经访问了我的模拟器并找到了它应该写入文件的目录,它在那里,但它的大小为零字节。

: adb root
: adb shell
: su
: cd /data/user/0/com.asset.management/files
: ls -al

Results
: -rw------- 1 u0_a78 u0_a78    0 2020-05-12 14:20 result.pdf

注意:我尝试将一些基本文本写入文件,这很有效。所以它必须与“数据”所在的格式有关。

更新:调试器中“数据”的结果

Blob _buffer: Uint8Array(23251), _size: 23251, _type: "application/pdf", Symbol(Symbol.toStringTag): "Blob"
size: 23251
type: "application/pdf"
Symbol(Symbol.toStringTag): "Blob"
_buffer: Uint8Array(23251) [37, 80, 68, 70, 45, 49, 46, 52, 10, 49, 32, 48, 32, 111, 98, 106, 10, 60, 60, 10, 47, 84, 105, 116, 108, 101, 32, 40, 254, 255, 41, 10, 47, 67, 114, 101, 97, 116, 111, 114, 32, 40, 254, 255, 0, 119, 0, 107, 0, 104, 0, 116, 0, 109, 0, 108, 0, 116, 0, 111, 0, 112, 0, 100, 0, 102, 0, 32, 0, 48, 0, 46, 0, 49, 0, 50, 0, 46, 0, 53, 41, 10, 47, 80, 114, 111, 100, 117, 99, 101, 114, 32, 40, 254, 255, 0, 81, 0, 116, 0, …]
_size: 23251
_type: "application/pdf"
__proto__: Object

更新:创建游乐场示例

https://play.nativescript.org/?template=play-ng&id=gA70GM&v=2

更新:在后端发送

这是我在示例中用于发送 test.pdf 的 Ruby on Rails 代码。在我的真实应用程序中,它是生成的 pdf 而不是文件。发送的工作原理相同。

  def index

    respond_to do |format|
      format.html
      format.pdf do
        send_file("#Rails.root/public/test.pdf")
      end
    end
  end

【问题讨论】:

你能设置一个游乐场吗? @Manoj 我已经成功创建了一个游乐场 我猜可能是Polyfills,你可以试试这个play.nativescript.org/?template=play-ng&id=gA70GM&v=3 @Manoj 成功了!!!请提交它作为答案。非常感谢。 【参考方案1】:

我认为这是由于 N 中的 Blob 的 Polyfills。您可以将 Blob 对象转换为 Byte 数组。

   this.http.get(url,  responseType: 'blob' )
        .subscribe(data => 

            const documentsFolder = knownFolders.documents();
            const destination = path.join(documentsFolder.path, 'result.pdf');
            const file = File.fromPath(destination);

            const blob = (Array as any).create("byte", data.size);
            for (let i = 0; i < blob.length; i++) 
                blob[i] = (data as any)._buffer[i];
            

            file.write(blob);
            this.pdfUrl = file.path;
        );

【讨论】:

以上是关于nativescript 保存 blob 错误无法将对象转换为 [B at index 1的主要内容,如果未能解决你的问题,请参考以下文章

“tns医生”后NativeScript“无法读取null的属性'匹配'”错误的解决方案是啥

错误:找不到模块:无法解析“/home/rakesh95/Projects/webapp/node_modules/quickblox/src/modules/chat”中的“nativescript

保存 Azure blob 连接器的逻辑应用标准问题

如何将 NativeScript 与 Angular CLI 集成

无法在 Spring 中将 MultipartFile 转换为 Blob

无法将空子视图添加到视图组 Nativescript-Vue