【问题标题】:Uploading a file to Azure Blob Storage using VBA and MS XMLHTTP使用 VBA 和 MS XMLHTTP 将文件上传到 Azure Blob 存储
【发布时间】:2015-10-22 16:13:44
【问题描述】:

我一直在尝试使用 Microsoft Access 中的 VBA 将文件上传到 Azure 存储,但到目前为止没有成功。

我进行了很好的搜索,发现了一些看起来很有希望的代码,但我无法让它工作。似乎许多其他人一直在寻找类似的解决方案或帮助从 VBA 使用 Azure。

这是代码;

Private Function pvPostFile(sUrl As String, sFileName As String, Optional ByVal bAsync As Boolean) As String
Const STR_BOUNDARY  As String = "3fbd04f5-b1ed-4060-99b9-fca7ff59c113"
Dim nFile           As Integer
Dim baBuffer()      As Byte
Dim sPostData       As String

'--- read file
nFile = FreeFile
Open sFileName For Binary Access Read As nFile
If LOF(nFile) > 0 Then
    ReDim baBuffer(0 To LOF(nFile) - 1) As Byte
    Get nFile, , baBuffer
    sPostData = StrConv(baBuffer, vbUnicode)
End If
Close nFile
'--- prepare body
sPostData = "--" & STR_BOUNDARY & vbCrLf & _
    "Content-Disposition: form-data; name=""uploadfile""; filename=""" & Mid$(sFileName, InStrRev(sFileName, "\") + 1) & """" & vbCrLf & _
    "Content-Type: application/octet-stream" & vbCrLf & vbCrLf & _
    sPostData & vbCrLf & _
    "--" & STR_BOUNDARY & "--"
'--- post
With CreateObject("Microsoft.XMLHTTP")
    .Open "POST", sUrl, bAsync
    .SetRequestHeader "Content-Type", "multipart/form-data; boundary=" & STR_BOUNDARY
    .Send pvToByteArray(sPostData)
    If Not bAsync Then
        pvPostFile = .ResponseText
    End If
End With
End Sub

Private Function pvToByteArray(sText As String) As Byte()
    pvToByteArray = StrConv(sText, vbFromUnicode)
End Function

(感谢 - https://wqweto.wordpress.com/2011/07/12/vb6-using-wininet-to-post-binary-file/

当我在表单中使用我的 azure 存储 URL 尝试此代码时

https://XXXXX.blob.core.windows.net/ 

和一个文件名 (C:\Temp\Test.txt) 我收到以下错误;

<?xml version="1.0" encoding="utf-8"?><Error><Code>UnsupportedHttpVerb</Code><Message>The resource doesn't support specified Http Verb.

我怀疑标题或帖子数据而不是 VBA 有问题,这不是我的真正领域。

非常感谢任何帮助。

【问题讨论】:

  • 我认为有几个问题: 1) URL应该是https://XXXXX.blob.core.windows.net/container-name/file-name。 2) 对 Azure 存储的所有请求都应该经过身份验证。我没有看到您在代码中的任何位置设置 Authorization 标头。
  • 感谢您的评论 - 我会看看这些。

标签: vba ms-access azure http-headers blob


【解决方案1】:

我在搜索将图像上传到 Azure Blob 存储的相同答案时遇到了这篇文章。我花了两天时间才得到答案。上面发布的代码确实帮助我部分解决了问题。

我想在这里发布我的解决方案,以防其他人正在寻找相同的答案。

在您可以使用下面的代码之前,您需要从您的 Azure 门户(管理面板)获取共享访问签名 (SAS)。你应该可以用谷歌搜索答案。

Public Sub UploadAfIle(sUrl As String, sFileName As String)
    Dim adoStream As Object
    Set adoStream = CreateObject("ADODB.Stream")
    adoStream.Mode = 3          ' read write
    adoStream.Type = 1          ' adTypeBinary
    adoStream.Open
    adoStream.LoadFromFile (sFileName)
    With CreateObject("Microsoft.XMLHTTP")
        adoStream.Position = 0
        .Open "PUT", sUrl, False
        .setRequestHeader "Content-Length", "0" 'this is not a must
        .setRequestHeader "x-ms-blob-type", "BlockBlob"
        .Send adoStream.Read(adoStream.Size)
    End With
    Set adoStream = Nothing
End Sub

sURL 是一个 URL 看起来像(我在中国,所以主机不同):https://myaccount.blob.core.chinacloudapi.cn/products/newimagename.jpg?sv=2016-05-31&ss=bfpq&srt=dco&sp=rydlscup&se=2017-07-30T18:40 :26Z&st=2017-07-28T10:40:26Z&spr=https&sig=mJgDyECayITp0ivVrD4Oug%2Bz%2chN7Wpo2nNtcn0pYRCU%4d

粗体字是您从 Azure 生成的 SAS 令牌。

【讨论】:

  • 感谢您跟进并发布此消息 - 我会看看。
  • 我已经成功地完成了这项工作 - 再次感谢您发布它。在使用 Azure 文件共享而不是 Blob 存储时,您知道标头类型吗? “x-ms-blob-type”、“BlockBlob”在尝试上传到文件共享时会产生错误
  • 很高兴知道这对您有用。我不知道 Azure 文件共享的标头类型。但我认为“x-ms-blob-type”应该是“x-ms-blob-content-type”。
【解决方案2】:

值得注意的是,SiliconXu 的答案中的 sUrl 格式是由 3 个部分组成的,我一开始没有意识到所以头疼了一会儿!!

1) Azure blob 容器 URL(来自存储资源管理器中的属性) 2)文件名(这是我错误省略的部分) 3) 共享访问签名

原来是这样构建的

sURL = destination_folder & "/" & local_file_name & "?" & conn_SAS

我没有直接在该答案下方发表评论的声誉

虽然代码很棒,但一旦我确定了 sURL 的格式,它就像做梦一样工作

【讨论】:

    【解决方案3】:

    Azure 存储服务使用私钥身份验证。由于 VBA 在最终用户的计算机上运行,​​因此您将自己暴露在与该密钥进入野外相关的一系列风险中。我建议重新考虑直接从 VBA 到 Azure 存储的整个前提,并使用您自己的 WebAPI 来处理将数据存储到 Blob。

    这将具有以下双重好处:

    1) 更容易与 VBA 和

    集成

    2) 保护未部署到最终用户计算机的解决方案组件背后的 Azure 存储私钥。

    【讨论】:

    • 感谢您的回答。此应用程序的安全性并不是真正的问题。我要避免的是必须在最终用户的机器上安装任何其他组件。我将使用什么来创建 WebAPI? (我是 VBA 程序员,其他语言知识有限)
    • 如果您想使用 VB.NET 构建一个,您可以从配置一个简单的 ASP.NET Web 应用程序开始。选择 WebAPI 2.0。然后你只需实现一个控制器来上传文件。查看此基本教程link。只要您上传的文件不是很大,就应该没问题。
    • 如果您以外的其他人将使用该应用程序,我仍然会担心。如果您的 Azure 存储密钥落入坏人之手而您没有注意,他们可能会为您带来巨额账单。
    • 感谢您的跟进 - 我会看看。我同意你关于安全性的观点,但在这种特殊情况下,这真的不是问题。
    • 经过大量尝试直接从 VBA 使其工作后,我找到了一个可以从适用于该应用程序的命令行调用的 Microsoft 工具。该工具称为 AzCopy,可处理来自 Azure 存储的文件的上传和下载。
    猜你喜欢
    • 2017-01-24
    • 2017-08-19
    • 1970-01-01
    • 2021-06-20
    • 2019-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-01
    相关资源
    最近更新 更多