- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在开发一个 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/
我正在开发一个 Web 应用程序,可以将大文件上传到 Azure Blob 存储。 作为后端,我在 NodeJS 中使用 Windows Azure 移动服务(Web 应用程序将为移动设备生成内容)。
我是一名优秀的程序员,十分优秀!