使用VBA和MS XMLHTTP将文件上载到Azure Blob存储

时间:2015-10-22 16:13:45

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

我一直在尝试使用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,这不是我的区域。

非常感谢任何帮助。

3 个答案:

答案 0 :(得分:1)

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

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

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

*ngIf="startDate"

sURL是一个类似于我的网址(我在中国,因此主机不同):https://myaccount.blob.core.chinacloudapi.cn/products/newimagename.jpg ?sv = 2016-05-31&amp; ss = bfpq&amp; srt = dco&amp; sp = rydlscup&安培; SE = 2017-07-30T18:40:26Z&安培; ST = 2017-07-28T10:40:26Z&安培; SPR = HTTPS&安培; SIG = mJgDyECayITp0ivVrD4Oug%2BZ%2chN7Wpo2nNtcn0pYRCU%4D

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

答案 1 :(得分:1)

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

1)Azure blob容器URL(来自Storage Explorer中的属性) 2)文件名(这是我误删的部分) 3)共享访问签名

所以是这样构建的

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

我没有名望,需要在该答案下方直接评论

尽管代码很棒,但当我确定sURL的格式后,它就像梦一样

答案 2 :(得分:0)

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

这将带来双重好处:

1)使其更容易与VBA和

集成

2)保护解决方案组件后面的Azure存储私钥,而不是将其部署到最终用户的计算机上。