gpt4 book ai didi

javascript - createBlockBlob 和 commitBlobBlocks 在 BlobStorage 中创建空文件

转载 作者:太空宇宙 更新时间:2023-11-04 02:33:23 25 4
gpt4 key购买 nike

我正在开发一个 Web 应用程序,可以将大文件上传到 Azure Blob 存储。

作为后端,我在 NodeJS 中使用 Windows Azure 移动服务(Web 应用程序将为移动设备生成内容)。

我的客户端可以成功地将大块数据发送到后端,一切看起来都很好,但最后上传的文件是空的。数据上传是按照本教程准备的:当文件小到足以在单个请求中上传时,它可以完美地工作。当文件需要分成 block 时,该过程会失败。它使用教程中的 ReadableStreamBuffer。

有人可以帮助我吗?

代码如下:

后端:createBlobBlockFromStream

[...]
//Get references
var azure = require('azure');
var qs = require('querystring');
var appSettings = require('mobileservice-config').appSettings;

var accountName = appSettings.STORAGE_NAME;
var accountKey = appSettings.STORAGE_KEY;
var host = accountName + '.blob.core.windows.net';

var container = "zips";
//console.log(request.body);
var blobName = request.body.file;
var blobExt = request.body.ext;
var blockId = request.body.blockId;
var data = new Buffer(request.body.data, "base64");
var stream = new ReadableStreamBuffer(data);
var streamLen = stream.size();

var blobFull = blobName+"."+blobExt;
console.log("BlobFull: "+blobFull+"; id: "+blockId+"; len: "+streamLen+"; "+stream);
var blobService = azure.createBlobService(accountName, accountKey, host);
//console.log("blockId: "+blockId+"; container: "+container+";\nblobFull: "+blobFull+"streamLen: "+streamLen);
blobService.createBlobBlockFromStream(blockId, container, blobFull, stream, streamLen,
function(error, response){
if(error){
request.respond(statusCodes.INTERNAL_SERVER_ERROR, error);
} else {
request.respond(statusCodes.OK, {message : "block created"});
}
});
[...]

后端:commitBlobBlock

[...]
var azure = require('azure');
var qs = require('querystring');
var appSettings = require('mobileservice-config').appSettings;

var accountName = appSettings.STORAGE_NAME;
var accountKey = appSettings.STORAGE_KEY;
var host = accountName + '.blob.core.windows.net';

var container = "zips";
var blobName = request.body.file;
var blobExt = request.body.ext;
var blobFull = blobName+"."+blobExt;
var blockIdList = request.body.blockList;
console.log("blobFull: "+blobFull+"; blockIdList: "+JSON.stringify(blockIdList));
var blobService = azure.createBlobService(accountName, accountKey, host);
blobService.commitBlobBlocks(container, blobFull, blockIdList, function(error, result){
if(error){
request.respond(statusCodes.INTERNAL_SERVER_ERROR, error);
} else {
request.respond(statusCodes.OK, result);
blobService.listBlobBlocks(container, blobFull)
}
});
[...]

第二个方法返回正确的 blockId 列表,因此我认为该过程的第二部分工作正常。我认为这是第一个无法将数据写入 block 内的方法,就好像它创建了一些空 block 一样。

在客户端,我使用 FileReader JS API 将文件作为 ArrayBuffer 读取。

然后我使用以下代码将其转换为 Base4 编码的字符串。如果我在一次调用中创建 blob,则此方法非常有效,适合小文件。

[...]
//data contains the ArrayBuffer read by the FileReader API
var requestData = new Uint8Array(data);

var binary = "";
for (var i = 0; i < requestData.length; i++) {
binary += String.fromCharCode( requestData[ i ] );
}
[...]

有什么想法吗?

谢谢你, 瑞克

最佳答案

您使用的是哪个版本的 Azure 存储 Node.js SDK?您可能正在使用旧版本;如果是这样,我建议升级到最新版本(截至撰写本文时为 0.3.0)。我们通过新库改进了许多领域,包括 blob 上传;您可能遇到了一个已经修复的错误。请注意,版本之间可能存在重大更改。

下载最新的 Node.js 模块(代码也在 Github 上) https://www.npmjs.org/package/azure-storage

阅读我们的博客文章:适用于 Node.js v. 0.2.0 的 Microsoft Azure 存储客户端模块 http://blogs.msdn.com/b/windowsazurestorage/archive/2014/06/26/microsoft-azure-storage-client-module-for-node-js-v-0-2-0.aspx

如果这不是问题,您可以检查 Fiddler 跟踪(或等效项)以查看原始数据 block 是否正在发送到服务吗?

关于javascript - createBlockBlob 和 commitBlobBlocks 在 BlobStorage 中创建空文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24677854/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com