【问题标题】:Upload Files to Azure Storage from Azure Function - Nodejs从 Azure 函数上传文件到 Azure 存储 - Nodejs
【发布时间】:2020-09-04 10:32:51
【问题描述】:

目前我正在使用像这样的 formdata 从 Angular 作为 blob 发送文件

  uploadFiles(file) {
    let testData: FormData = new FormData();
    testData.append('file_upload', file, file.name);
    console.log("TESTDATA", file);
    console.log(file);
    return this.http
      .post<{ message: string; listingId: string; creator: string }>(
        environment.azure_function_url + `/UploadFilesTest`,
        testData
      );
  }

我可以通过answer 在 azure 函数中接收它 在我的天蓝色函数中,但我不确定如何从这里到达天蓝色 blob。我不确定将什么传递给 blobService.createBlockBlobFromLocalFile 以将文件放入 blob 存储。我尝试传递 parts 和 image 变量,但它一直说 Parameter blob for function _createBlobFromLocalFile should be a non-empty string 如果我在底部返回注释掉的代码,那么前端返回

这对我来说似乎很有希望,我在正确的轨道上,但我只是不知道如何让它与createBlockBlobFromLocalFile() 函数一起玩得很好。感谢您的帮助!

var multipart = require("parse-multipart");
var azure = require('azure-storage');
var blobService = azure.createBlobService(process.env.AZURE_STORAGE_AUCTIONIMAGESACCOUNT, process.env.AZURE_STORAGE_AZURE_STORAGE_AUCTIONIMAGESACCOUNT_ACCESS_KEY);

module.exports = function (context, req) {

  // encode body to base64 string
  var bodyBuffer = Buffer.from(req.body);

  var boundary = multipart.getBoundary(req.headers['content-type']);
  // parse the body
  var parts = multipart.Parse(bodyBuffer, boundary);
  console.log(parts)
  let image = [{ name: parts[0].filename, type: parts[0].type, data: parts[0].data.length }];
  // context.res = { body: { name: parts[0].filename, type: parts[0].type, data: parts[0].data.length, "TEST": "TEST" } };
  // context.done();
  // return;

  blobService.createBlockBlobFromLocalFile('auctionimages', image, 'image.png', function (error, result, response) {
    if (!error) {
      // file uploaded
    }
  });


};

【问题讨论】:

  • 是否使用formidable 选项?几天前我在使用该软件包时回答了一个类似的问题。
  • 只要我可以让它工作,我不在乎它是如何完成的,哈哈。我确实读过 azure 函数在处理文件时有点棘手,所以我不确定强大是否会起作用,但我不是专家
  • 看看这是否有帮助:stackoverflow.com/questions/61423408/….
  • Azure 函数的设置略有不同。该答案中的人也提到了这个I had to tune it for Azure functions,所以我需要一个以天蓝色功能为中心的解决方案。我不确定这对我有用
  • @user6680 请参考medium.com/@rkmusic75/…

标签: node.js azure azure-storage


【解决方案1】:

如果要将 blob 保存为 Azure blob 存储中的图像,您希望在我们使用 createBlockBlobFromStream 方法上传文件时通过创建 CreateBlockBlobRequestOptions 来设置 blob 内容类型。

例如


const streamifier = require('streamifier');
const multipart = require('parse-multipart');
const azure = require('azure-storage');

module.exports =  function (context, req) {
  var bodyBuffer = Buffer.from(req.body);
  var boundary = multipart.getBoundary(req.headers['content-type']);
  var parts = multipart.Parse(bodyBuffer, boundary);

  var filedata = parts[0].data;         // Image buffer data
  var filename = parts[0].filename;     // testImage.png
  console.log("parts[0].data");
  console.log(parts[0].data);
  console.log("parts[0].filename");
  console.log(parts[0].filename);
  const accountname ="blobstorage0516";
  const key = "eGier5YJBzr5z3xgOJUb+sn***7Csvgx75NwiOZE7kYLJfLqWBg==";
  const containerName="test1";
  const blobClient  =azure.createBlobService(accountname,key);
 # set blob content type
  var options = {
    contentSettings:{contentType: parts[0].type}
  };
  blobClient.createBlockBlobFromStream(containerName,filename,streamifier.createReadStream(new Buffer(filedata)), filedata.length,options,(err,result)=>{

    if (!err) {
        console.log("Image upload successful", result);

    } else{

      throw err;
    }
  })
  context.res = {
    // status defaults to 200 */
    body: "ok"
};
context.done();
};

【讨论】:

  • 我使用您的答案更新了我的代码并将其上传到存储:postimg.cc/LhQh8hVV。它将图像/jpeg 显示为内容类型,但文件缺少文件扩展名。如果我单击该文件以从存储中查看它,那么它会显示the image &lt;URL&gt; can't be displayed because it contained errors. 我认为它与输出值blob 而不是testImage.png 之类的console.log(parts[0].filename) 有关它没有正确访问文件名属性,但它确实有从我的 console.log pastebin.com/ise1z5CM 中可以看到数组缓冲区。有什么想法吗?
  • @user6680, parts[0].filename 将在Formdata 中获取您的File 对象名称的保管库。根据你提供的图片,文件名是blob
  • 显然,当从我的 Angular 应用程序发送时它不起作用,但它确实从邮递员那里工作。我从邮递员发送了一个文件,它运行良好,但是从我的应用程序中我遇到了我一直遇到的问题,这意味着它与我发送文件的方式有关我猜我必须以不同的方式发送文件来自 Angular 的格式,而不是 blob 类型。我相信 blob 是类型。 console.log("imageData", file.name) 输出 postimg.cc/8sTr5jrF console.log("imageData", file); 输出 postimg.cc/hhR10DQg 更新的角度服务:pastebin.com/k2heZrrP
  • @user6680 请尝试将您的 Angular 应用程序中的文件作为 File 类型发送到 Azure 函数。更多详情请参考stackoverflow.com/questions/47936183/angular-file-upload
猜你喜欢
  • 2017-01-04
  • 2022-01-26
  • 1970-01-01
  • 1970-01-01
  • 2020-10-29
  • 2021-03-07
  • 1970-01-01
  • 2020-01-09
  • 2017-01-24
相关资源
最近更新 更多