Próbuję uzyskać wersję umożliwiającą użytkownikom przesyłanie plików bezpośrednio do mojego zasobnika Amazon S3 z witryny sieciowej NodeJS. Wygląda na to, że jedyne tutoriale poza nim są inne niż wszystkie.Aplikacja Amazon S3 POST api i podpisywanie polisy z NodeJS
Podążam za this tutorial, aby uzyskać podstawowe informacje, ale znowu jest przestarzały. Nie ma poprawnych wywołań metody do crypto
, ponieważ próbuje przekazać surowy obiekt JavaScript do metody update
, która zgłasza błąd, ponieważ nie jest łańcuchem ani buforem.
Ja również szukałem źródła dla the knox npm package. Nie ma wbudowanego wsparcia POST - co rozumiem całkowicie, ponieważ to przeglądarka robi POST, gdy ma właściwe pola. Wygląda na to, że Knox ma odpowiedni kod do podpisania polityki, a ja próbowałem sprawić, by mój kod działał w oparciu o to ... ale znowu bez skutku.
Oto, co wymyśliłem, dla kodu. Tworzy zasadę zakodowaną w base64 i tworzy podpis ... ale jest to zła sygnatura zgodna z Amazon, kiedy próbuję przesłać plik.
var crypto = require("crypto");
var config = require("../../amazonConfig.json");
exports.createS3Policy = function(callback) {
var date = new Date();
var s3Policy = {
"expiration": "2014-12-01T12:00:00.000Z",
"conditions": [
{"acl": "public-read"},
["content-length-range", 0, 2147483648],
{"bucket": "signalleaf"},
["starts-with", "$Cache-Control", ""],
["starts-with", "$Content-Type", ""],
["starts-with", "$Content-Disposition", ""],
["starts-with", "$Content-Encoding", ""],
["starts-with", "$Expires", ""],
["starts-with", "$key", "/myfolder/"],
{"success_action_redirect": "http://example.com/uploadsuccess"},
]
};
var stringPolicy = JSON.stringify(s3Policy).toString("utf-8");
var buffer = Buffer(stringPolicy, "utf-8");
var encoded = buffer.toString("base64");
var signature = crypto.createHmac("sha1", config.secretKey)
.update(new Buffer(stringPolicy, "utf-8")).digest("base64");
var s3Credentials = {
s3PolicyBase64: encoded,
s3Signature: signature
};
GLOBAL.s3creds = s3Credentials;
callback(s3Credentials);
};
Oczywiście robię coś złego tutaj. Ale nie mam pojęcia co. Czy ktoś może pomóc w identyfikacji tego, co robię źle? Gdzie jest mój problem? Czy ktoś ma działający samouczek, w jaki sposób wygenerować odpowiednią politykę Amazon S3, z podpisem, z NodeJS v0.10.x, dla POST do s3 REST API?
Przesyłanie plików bezpośrednio do S3 nie jest to banalne zadanie, zwłaszcza jeśli chcesz wesprzeć wyrwy, automatyczne wznawianie metadanych użytkownika, itp, itd. Rzeczy polityka _możesz_ być dość skomplikowane. Rozważ użycie biblioteki, którą utrzymuję: [Fine Uploader] (http://fineuploader.com). Ma natywną obsługę bezpośredniego przesyłania do S3 we wszystkich przeglądarkach, nawet IE7. Chunking i automatyczne wznawianie, oprócz innych funkcji, są również obsługiwane. Ponadto napisałem [przykład serwera po stronie serwera] (http://bit.ly/1do27a0), który po sparowaniu z programem Fine Uploader S3 obsłuży wszystkie twoje podpisy. –
Czy możesz opublikować ten komentarz jako odpowiedź? może skończyć się używanie twojej biblioteki. wciąż oceniam, jak to działa, itp. –
Nie jestem pewien, czy to się dobrze skończy. Można to uznać za odpowiedź ubogą lub łączącą, szczerze mówiąc. Rozumiem, że społeczność szuka szczegółowych odpowiedzi, które zawierają kod, a mój nie pasuje do tego opisu, dlatego opublikowałem go jako komentarz. Jeśli masz jakieś pytania dotyczące Fine Uploader, zajrzyj do tagu fine-uploader na SO, gdzie zajmujemy się obsługą pytań do biblioteki. –