我正在使用webRTC开发一个FileShare应用程序.我想在
JavaScript / HTML中实现客户端.代码应该在客户端浏览器上运行.
我通过webRTC下载时需要保存它们.这些文件可能很大,我不能完全把它们保存下来,并将它们保存在数组或blob中,然后将它们保存到磁盘中作为文件.
我通过webRTC下载时需要保存它们.这些文件可能很大,我不能完全把它们保存下来,并将它们保存在数组或blob中,然后将它们保存到磁盘中作为文件.
有没有API可以让我在接收到文件时将其保存在块中?
到目前为止,我已经发现了Downloadify,FileSave.js和html5 FileWriterApi.
虽然前两个没有分块,要求我先保存完整的文件到内存,但FileWriterAPI在大多数浏览器上都不可用.
解决方法
如@ jordan-gray所建议的,将块保存在blob中并将它们加入到更大的blob中可能是一个解决方案,如果:
>不需要块的持久化(即关闭浏览器将删除所有块)
>该文件只能由用户将其保存到自己的文件系统.网络应用程序关闭后无法访问该文件,除非用户再次访问保存的文件.
>可能的是,如果文件大小不太大(您必须进行基准测试才能找到). Chrome对我来说表现相当不错,总共为1GB.
我创建了一个simple test for using blobs as chunks.你可以玩不同的大小和块号参数:
var chunkSize = 500000; var totalChunks = 200; var currentChunk = 0; var mime = 'application/octet-binary'; var waitBetweenChunks = 50; var finalBlob = null; var chunkBlobs =[]; function addChunk() { var typedArray = new Int8Array(chunkSize); chunkBlobs[currentChunk] = new Blob([typedArray],{type: mime}); console.log('added chunk',currentChunk); currentChunk++; if (currentChunk == totalChunks) { console.log('all chunks completed'); finalBlob = new Blob(chunkBlobs,{type: mime}); document.getElementById('completedFileLink').href = URL.createObjectURL(finalBlob); } else { window.setTimeout(addChunk,waitBetweenChunks); } } addChunk();
如果您确实需要持久性,则W3C File System API应该支持您所需要的.您可以使用它将块写入单独的文件,然后当所有块完成后,您可以将它们全部读取并附加到单个文件中,并删除块.
请注意,它可以通过为应用程序分配沙盒文件系统(对于给定的配额),文件只能由该应用程序访问.如果文件意图在Web应用程序之外使用,则可能需要使用该功能将文件从应用程序文件系统保存到他的“正常”文件系统.您可以使用createObjectURL()方法做这样的事情.
您是正确的浏览器支持的当前状态. A Filesystem API polyfill是可用的,它是基于IndexedDB(被广泛支持的)作为文件系统仿真后端.我没有在大文件上测试polyfill.您可能会遇到大小限制或性能限制.