2017-03-01 58 views
0

一個衆所周知的vbs腳本已經傳播,可以使用REST API從Windows服務器將文件發送到Amazon S3,並且它非常適合自動備份。 REST API還包含文件刪除操作,但我沒有在任何地方看到任何工作腳本,而我自己的卑微努力失敗了。如何使用REST API從vbs腳本中刪除S3對象

此作品(放置操作,部分代碼):

... 
StringToSign = Replace("PUT\n\napplication/octet-stream\n\nx-amz-date:" & gmtDateStr & "\n/"& AWS_BUCKETNAME & sRemoteFilePath, "\n", vbLf) 
... 
With CreateObject("Microsoft.XMLHTTP") 
.open "PUT", AWSBucketUrl & sRemoteFilePath, False 
... 

這不起作用:

... 
StringToSign = Replace("DELETE\n\ntext/plain\n\nx-amz-date:" & gmtDateStr & "\n/"& AWS_BUCKETNAME & sRemoteFilePath, "\n", vbLf) 
... 
With CreateObject("Microsoft.XMLHTTP") 
.open "DELETE", AWSBucketUrl & sRemoteFilePath, False 
... 

返回的錯誤是「SignatureDoesNotMatch - 我們出的要求籤名不匹配你提供的簽名,檢查你的密鑰和簽名方法。「由於put操作正常,錯誤似乎不在key和簽名方法中。試圖刪除代碼中的StringToSign可能不正確。

有沒有人曾經做過這樣的事情,或者代碼中的錯誤是明顯的?

+0

與傳遞給'PUT'示例相比,'StringToSign'中的mime類型看起來不對。爲什麼它是'text/plain'? – Lankymart

回答

0

因爲您沒有發送內容,所以您不要在DELETE請求中放置Content-Type標頭。

由於沒有Content-Type標題,因此您將該元素設置爲要簽名的字符串中的空字符串。保持原來的所有\n

+0

S3文檔不明確:http://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectDELETE.html 語法塊不包括Content-Type bud包含Content-Length。然後,頁面上較低的示例請求包括Content-Type,但不包含Content-Length。具有版本控制的示例請求包括兩者。頭旋轉。 – user1207313

+0

啊哈!如果錯誤消息顯示目標字符串,則問題是:刪除請求字符串標記會忽略與放入請求一起出現的「x-amz-date:」。當我刪除它,它的工作。日期本身仍然是必需的。 – user1207313

+0

替換已刪除的評論,這將在序列中排在第一位:謝謝,Michael - 您的建議是合理的,並讓我意識到S3 xml錯誤消息中的項實際上是目標字符串(不是讀取回到我提交的內容)。 「文本/平原」實際上就在那裏。這回來爲: '刪除 text/plain的 週三,2017年3月1日19時23分13秒UTC /桶/文件夾/文件' – user1207313