【问题标题】:How to upload a csv file to blob storage using axios/fetch (nodejs)如何使用 axios/fetch (nodejs) 将 csv 文件上传到 blob 存储
【发布时间】:2020-02-29 10:05:55
【问题描述】:

我正在尝试自动化(用于测试自动化)上传/下载/验证托管在 Azure 云中的应用程序的 csv 文件数据,并且正在关注这篇文章:

https://medium.com/@fakiolinho/handle-blobs-requests-with-axios-the-right-way-bb905bdb1c04

并尝试按指示实现它,但是,在以下 (action.js) 中找不到“actionTypes”:

import * as types from './actionTypes'; 有点迷失重新开始。

[Error: Cannot find module './actionTypes']


根据我的学习,我相信 axios 或 fetch 可用于执行任务(我更喜欢 axios),我需要一些帮助来记下解决方案或帮助以正确的方向完成任务。

我了解有人提出了与此方案相关的类似问题,但是,到目前为止,这些问题都没有得到解决,或者它们属于不同的工具和技术堆栈。

请提出更好的方法、工具或示例。

Blob 存储链接示例:

https://portal.azure.com/#blade/Microsoft_Azure_Storage/ContainerMenuBlade/overview/storageAccountId/%2Fsubscriptions%2F0d2c6-7dba6272e3a1%2FresourceGroup%2Fpre-prod-net%2Fproviders%2FMicrosoft.Storage%2FstorageAccounts%2Fapistorage/path/input-folder/etag/%210x8D6B31B54E2%22

【问题讨论】:

    标签: node.js file-upload axios fetch azure-blob-storage


    【解决方案1】:

    使用 axios 试试这个:

    var axios = require('axios').default;
    var fs = require('fs');
    var crypto =  require('crypto');
    
    var storageKey = "<your storage key>"
    var accountName = "<your storage account name>"
    var containerName="<your container name>"
    var fileName="<file name>"
    var filePath = "<file path ,including file name>"
    
    
    var fileLength= fs.statSync(filePath).size
    var fileStream = fs.createReadStream(filePath);
    
    var blobType ="BlockBlob"
    var date = new Date().toUTCString()
    var blobServiceVersion = "2014-02-14"
    
    var storageBlobEndpoint = "https://"+ accountName +".blob.core.windows.net"
    var requestURL = storageBlobEndpoint + "/" + containerName + "/" + fileName
    var requestMethod = "PUT"
    
    
    var canonicalizedHeaders = "x-ms-blob-type:"+ blobType +"\nx-ms-date:"+ date +"\nx-ms-version:" + blobServiceVersion;
    console.log("headers :"+canonicalizedHeaders);
    var canonicalizedResource = accountName + "/" + containerName + "/" +  fileName
    
    var stringToSign = requestMethod+"\n\n\n"+fileLength+"\n\napplication/x-www-form-urlencoded\n\n\n\n\n\n\n" + canonicalizedHeaders + "\n/" + canonicalizedResource
    
    var signature = crypto.createHmac('sha256', Buffer.from(storageKey, 'base64')).update(stringToSign, 'utf-8').digest('base64');
    
    var authorizationHeader = "SharedKey "+accountName + ":" + signature
    
    
      const result = axios({
            baseURL: requestURL,
            method: requestMethod,
            data:fileStream,
            headers: {
                'Content-Length':fileLength,
                'x-ms-blob-type': blobType,
                'x-ms-date':date,
                'x-ms-version':blobServiceVersion,
                'Authorization' : authorizationHeader
                }
            }).then(function (response) {
        console.log(response);
      })
      .catch(function (error) {
        console.log(error);
      })
      .finally(function () {
        //add finally function here if needed 
      });  
    

    使用 REST API 将文件上传到存储是相当复杂的。使用 SDK 会容易得多。希望对您有所帮助。

    【讨论】:

    • 嗨@curiousTester,您的CSV 上传成功了吗?还有什么我可以帮忙的吗?
    • 嗨@Stanley Gong,感谢您发送解决方案,它工作正常,我唯一需要更改的是authorizationHeader 的处理方式并添加了更多的标题道具。此外,我尝试了 SDK 解决方案,这似乎非常简单明了,并且会继续使用它们。
    • 嗨@curiousTester,很高兴知道它有帮助!那么您能否标记这个答案,以便它可以帮助有类似问题的其他人,这对我来说将是一个奖励:)
    【解决方案2】:

    作为 Axios 方法的替代方案,以下可以用作简单的解决方案:

    https://docs.microsoft.com/en-us/azure/storage/blobs/storage-quickstart-blobs-nodejs-v10

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-12-01
      • 1970-01-01
      • 2019-08-13
      • 2023-03-25
      • 2019-06-27
      • 2021-03-05
      • 2018-05-31
      相关资源
      最近更新 更多