Klassische ASP-amazon s3 rest-Zulassung
Ich verwirrt bin, was mache ich hier falsch...
<script language="javascript" runat="server">
function GMTNow(){return new Date().toGMTString()}
</script>
<%
Const AWS_BUCKETNAME = "uk-bucketname"
Const AWS_ACCESSKEY = "GOES HERE"
Const AWS_SECRETKEY = "SECRET"
LocalFile = Server.Mappath("/test.jpg")
Dim sRemoteFilePath
sRemoteFilePath = "/files/test.jpg" 'Remote Path, note that AWS paths (in fact they aren't real paths) are strictly case sensitive
Dim strNow
strNow = GMTNow() ' GMT Date String
Dim StringToSign
StringToSign = Replace("PUT\n\nimage/jpeg\n\nx-amz-date:" & strNow & "\n/"& AWS_BUCKETNAME & sRemoteFilePath, "\n", vbLf)
Dim Signature
Signature = BytesToBase64(HMACSHA1(AWS_SECRETKEY, StringToSign))
Dim Authorization
Authorization = "AWS " & AWS_ACCESSKEY & ":" & Signature
Dim AWSBucketUrl
AWSBucketUrl = "http://s3.amazonaws.com/" & AWS_BUCKETNAME
With Server.CreateObject("Microsoft.XMLHTTP")
.open "PUT", AWSBucketUrl & sRemoteFilePath, False
.setRequestHeader "Authorization", Authorization
.setRequestHeader "Content-Type", "image/jpeg"
.setRequestHeader "Host", AWS_BUCKETNAME & ".s3.amazonaws.com"
.setRequestHeader "x-amz-date", strNow
.send GetBytes(LocalFile) 'Get bytes of local file and send
If .status = 200 Then ' successful
Response.Write "<a href="& AWSBucketUrl & sRemoteFilePath &" target=_blank>Uploaded File</a>"
Else ' an error ocurred, consider xml string of error details
Response.ContentType = "text/xml"
Response.Write .responseText
End If
End With
Function GetBytes(sPath)
dim fs,f
set fs=Server.CreateObject("Scripting.FileSystemObject")
set f=fs.GetFile(sPath)
GetBytes = f.Size
set f=nothing
set fs=nothing
End Function
Function BytesToBase64(varBytes)
With Server.CreateObject("MSXML2.DomDocument").CreateElement("b64")
.dataType = "bin.base64"
.nodeTypedValue = varBytes
BytesToBase64 = .Text
End With
End Function
Function HMACSHA1(varKey, varValue)
With Server.CreateObject("System.Security.Cryptography.HMACSHA1")
.Key = UTF8Bytes(varKey)
HMACSHA1 = .ComputeHash_2(UTF8Bytes(varValue))
End With
End Function
Function UTF8Bytes(varStr)
With Server.CreateObject("System.Text.UTF8Encoding")
UTF8Bytes = .GetBytes_4(varStr)
End With
End Function
%>
Jetzt immer der Fehler.
msxml3.dll error '800c0008'
The download of the specified resource has failed.
/s3.asp, line 39
- Hast du es geschafft, zu finden, Ihr problem, Chris?
- Nein noch nicht 🙁
- Hallo Chris, bist du angemeldet für den Amazon S3 service als auch ein AWS-Konto? das ist der thread forums.aws.amazon.com/thread.jspa?threadID=45582
- Ja, ich habe einen Eimer set-up und bereit zu gehen 🙂
- +1 für den Mut, kombiniert innovatives cloud-tech mit stone age ASP-tech. Hoffe, du findest eine gute Lösung.
- Definieren Sie die vollständige relative Pfad in
sRemoteFilePath
als/files/test.jpg
.GetBytes
geändert wurde, falsch. Es muss wieder bytes der Datei, nicht Größe Byte. Ich werde aktualisieren, meine Antwort mit diesen Verbesserungen, wie Sie benötigen Strom. Als Ausgangspunkt, kopieren Sie einfach und verwenden Sie nach dem ändern der S3-Anmeldeinformationen. - Ich habe aktualisiert mein code, das problem ist dass Sie mir.
"The requested header was not found"
Problem code ist.send GetBytes(LocalFile)
- Das ist mit MSXML2.ServerXMLHTTP.3.0 wenn ich 6.0 bekomme ich
The HTTP redirect request failed
gleichen Zeile code.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Möchte ich erklären, wie der S3 Rest-Api funktioniert soweit ich weiß.
Zuerst, Sie müssen lernen, was sollte der string auf Zeichen von Amazon akzeptiert.
Format :
Generieren unterzeichnet string :
Vorbei authorization-header:
Leider spielen Sie byte für byte, da gibt es kein SDK veröffentlicht, für das klassische asp. So, sollten verstehen, indem ich die gesamte Seite http://docs.amazonwebservices.com/AmazonS3/latest/dev/RESTAuthentication.html
String zu unterzeichnen, wie Sie oben sehen können in format, es gibt drei native Header reserviert sind, die von der API. Content-Type, Content-MD5 und Datum. Diese Header werden muss, existiert in der string-Zeichen auch Ihre Anfrage nicht Ihnen als, leer, ohne header-Namen, nur seinen Wert. Es ist eine Ausnahme, die
Date
Kopf muss leer sein string der Zeichen, wennx-amz-date
header ist bereits in der Anfrage. Dann, Wenn die Anfrage hat canonical die amazon-Header, fügen Sie Sie als Schlüssel-Wert-Paare wiex-amz-headername:value
. Aber, es gibt eine weitere Ausnahme, die berücksichtigt werden müssen für mehrere Kopfzeilen. Mehrere Header sollte zu kombinieren, um eine Kopf-mit Werten, die durch Komma getrennt sind.Richtige
Falsch
Allem, Kopfzeilen müssen aufsteigen, um von dessen Gruppe in der Zeichenfolge in Zeichen. Ersten, reservierten Header mit aufsteigender Reihenfolge, dann canonical Header mit aufsteigender Reihenfolge.
Ich würde empfehlen, mit
DomDocument
Funktionalität zu generieren, die Base64-kodierte strings.Zusätzlich anstelle eines Windows-Scripting-Komponente (.wsc-Dateien), die Sie nutzen könnten .Net interops wie
System.Security.Cryptography
zu generieren keyed hashes mehr effektiv mit der Kraft derSystem.Text
. Alle diese interoperabilities sind in der heutigen IIS-web-Server.So, als Beispiel schrieb ich den untenstehenden script nur sendet eine Datei zum Eimer, die Sie angegeben. Betrachten und testen Sie es.
Angenommen name der lokalen Datei ist
myimage.jpg
- und hochgeladen wird, mit demselben Namen zum Stamm der Gruppe.HttpSniffer
, kann es herausfinden. Zusätzlich, sollten Sie vielleicht versuchen, ältere Versionen von MSXML z.B.MSXML2.ServerXMLHTTP.3.0
AWSBucketUrl = "https://" & AWS_BUCKETNAME & ".s3.amazonaws.com"
- das löst die redirect-Fehler.Amazon Signature url-codiert werden muss in einer etwas anderen Weise zu dem, was VBSCript codiert. Die folgende Funktion codieren, ist das Ergebnis korrekt:
JScript-Version:
VBScript, Version:
Als base64, die ich verwendet habe .NETTO ist bereits integrierten Funktionalität für Sie. Ich hatte um eine DLL zu erstellen, um wickeln Sie es, so dass ich es verwenden von JScript (oder VBScript).
Hier ist, wie zu schaffen, dass dll:
Den code für die base64-Zeug wäre:
Müssen Sie die relevanten aufzuhalten der Benutzung:
Unterschrift zu voll werden, müssen alle query-string name-Wert-Paare in alphabetischer Reihenfolge vor, die Berechnung des SHA " und "base64". Hier ist meine version des Signatur-creator-Funktion:
VBScript nicht über eine sehr gute array-sort-Anlage, so dass Sie arbeiten müssen, dass man aus sich selbst - sorry
Auch ich habe die Zeitstempel in diesem format:
YYYY-MM-DDTHH:MM:SSZ
Auch die Sachen, die in der Abfragezeichenfolge enthalten die folgenden:
Hoffe, das hilft
Danke dir so sehr für diese Frage, es war wie ein große Hilfe um zu starten meine WSH/VBScript für mein S3-backup-service 😉
Ich habe nicht viel Zeit, also werde ich nicht durch die Einzelheiten der Dinge, die ich geändert von Chris' code, aber bitte finden Sie nachstehend meine kleine Prototyp Skript funktioniert perfekt 😉
Dies ist nur ein WSH/VBScript, so dass Sie nicht brauchen, IIS, um es auszuführen, müssen Sie nur fügen Sie den Inhalt in eine Datei mit der ".vbs" - Erweiterung, und Sie können dann direkt ausführen 😉
Liebe Stein-edge-Technologie-VBScript-Verknüpfungen (*), lassen Sie mich wissen,, wenn es für Sie arbeitet, wie auch 😉
(*) Dies ist ein Verweis auf den Kommentar von Spudley, siehe oben 😉