2015-10-22 203 views
0

我一直試圖使用Microsoft Access中的VBA將文件上載到Azure存儲,但迄今爲止沒有成功。使用VBA和MS將文件上傳到Azure Blob存儲XMLHTTP

我有一個很好的搜索,並找到了一些看起來很有希望的代碼,但我無法得到它的工作。看起來像許多其他人一直在尋找類似的解決方案或幫助與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)URL應該是'https:// XXXXX.blob.core.windows.net/container-name/file-name'。2)所有對Azure存儲的請求都應進行身份驗證。我沒有看到你在代碼中的任何地方設置了'Authorization'頭文件。 –

+0

感謝您的評論 - 我會看看這些。 – jhTuppeny

回答

0

我遇到這篇文章,因爲我正在搜索將圖像上傳到Azure Blob存儲的相同答案。我花了2天才得到答案。上面的代碼確實幫助我部分解決了這個問題。

我想在這裏發佈我的解決方案,以防其他人正在尋找相同的答案。

在使用下面的代碼之前,您需要從Azure門戶(管理面板)獲取共享訪問簽名(SAS)。你應該可以在google上找到答案。

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.jpgSV = 2016年5月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

的一個加粗是令牌時所產生的SAS來自Azure。

+0

感謝您跟進併發布此信息 - 我會看一看。 – jhTuppeny

+0

我已經設法讓這個工作 - 再次感謝張貼它。 您是否知道使用Azure文件共享而不是blob存儲時的標題類型?嘗試上傳到文件共享時,「x-ms-blob-type」,「BlockBlob」會生成錯誤 – jhTuppeny

+0

很高興知道這適用於您。我不知道Azure文件共享的標題類型。但我認爲「x-ms-blob-type」應該是「x-ms-blob-content-type」。 – SiliconXu

0

Azure存儲服務使用私鑰驗證。由於VBA運行在最終用戶的機器上,因此您將暴露與這個關鍵問題相關的大量風險。我建議重新思考從VBA直接轉到Azure存儲的整個前提,並利用您自己的WebAPI處理將數據存儲到Blob。

這將有雙重好處:

1使其更容易與VBA集成和

2)保護您的Azure存儲私鑰您的解決方案的一個組成部分,不落後)部署到最終用戶的機器上。

+0

感謝您的回答。這個應用程序的安全性並不是真正的問題。我想避免的是必須在最終用戶的機器上安裝任何附加組件。我會用什麼來創建WebAPI? (我是一名VBA編程人員,而且我的其他語言知識有限) – jhTuppeny

+0

如果您想用VB.NET構建一個,您可以從配置一個簡單的ASP.NET Web應用程序開始。選擇WebAPI 2.0。然後你只需實現一個控制器來上傳文件。看看這個基本的教程[鏈接](http://www.c-sharpcorner.com/UploadFile/2b481f/uploading-a-file-in-Asp-Net-web-api/)。只要你上傳的文件不是很大,你應該沒問題。 – emseetea

+0

如果除了你之外的其他人將要使用該應用程序,我仍然會擔心。如果您的Azure存儲密鑰落入了錯誤的人手中,並且您沒有注意,他們可能會爲您提供相當龐大的賬單。 – emseetea

相關問題