我一直在尝试使用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,这不是我的区域。
非常感谢任何帮助。
答案 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存储私钥,而不是将其部署到最终用户的计算机上。