Загрузка изображения в Amazon s3 с помощью HTML, javascript и JQuery с помощью Ajax-запроса (без PHP)
Я разрабатываю сайт в HTML, javascript & jQuery. Я хочу загрузить изображения на сервер amazon s3 в запросе ajax. Нет такого SDK для интеграции s3 в Javascript. PHP SDK доступен, но это не полезно для меня. Может ли кто-нибудь предоставить решение для этого в javascript?
5 ответов:
получил Amazon S3 & CORS работает на js и html5 с помощью XMLHTTPObject на основе этой статьи статьи.
1: CORS работает только с правильного URL"http://localhost". (файл / / / xyz заставит вас сойти с ума)
2: Убедитесь, что вы правильно скомпилировали политику и секрет-вот моя политика, и это ссылка, по которой вы можете получить проект, чтобы начать работу с подпись и Политика -- не публикуйте этот JS с вашим Тайное когда-нибудь!
POLICY_JSON = { "expiration": "2020-12-01T12:00:00.000Z", "conditions": [ {"bucket": this.get('bucket')}, ["starts-with", "$key", ""], {"acl": this.get('acl')}, ["starts-with", "$Content-Type", ""], ["content-length-range", 0, 524288000] ] }; var secret = this.get('AWSSecretKeyId'); var policyBase64 = Base64.encode(JSON.stringify(POLICY_JSON)); console.log ( policyBase64 ) var signature = b64_hmac_sha1(secret, policyBase64); b64_hmac_sha1(secret, policyBase64); console.log( signature);вот код JS
function uploadFile() { var file = document.getElementById('file').files[0]; var fd = new FormData(); var key = "events/" + (new Date).getTime() + '-' + file.name; fd.append('key', key); fd.append('acl', 'public-read'); fd.append('Content-Type', file.type); fd.append('AWSAccessKeyId', 'YOUR ACCESS KEY'); fd.append('policy', 'YOUR POLICY') fd.append('signature','YOUR SIGNATURE'); fd.append("file",file); var xhr = getXMLHTTPObject(); xhr.upload.addEventListener("progress", uploadProgress, false); xhr.addEventListener("load", uploadComplete, false); xhr.addEventListener("error", uploadFailed, false); xhr.addEventListener("abort", uploadCanceled, false); xhr.open('POST', 'https://<yourbucket>.s3.amazonaws.com/', true); //MUST BE LAST LINE BEFORE YOU SEND xhr.send(fd); }вспомогательные функции
function uploadProgress(evt) { if (evt.lengthComputable) { var percentComplete = Math.round(evt.loaded * 100 / evt.total); document.getElementById('progressNumber').innerHTML = percentComplete.toString() + '%'; } else { document.getElementById('progressNumber').innerHTML = 'unable to compute'; } } function uploadComplete(evt) { /* This event is raised when the server send back a response */ alert("Done - " + evt.target.responseText ); } function uploadFailed(evt) { alert("There was an error attempting to upload the file." + evt); } function uploadCanceled(evt) { alert("The upload has been canceled by the user or the browser dropped the connection."); }тогда HTML-форма
<form id="form1" enctype="multipart/form-data" method="post"> <div class="row"> <label for="file">Select a File to Upload</label><br /> <input type="file" name="file" id="file" onchange="fileSelected()"/> </div> <div id="fileName"></div> <div id="fileSize"></div> <div id="fileType"></div> <div class="row"> <input type="button" onclick="uploadFile()" value="Upload" /> </div> <div id="progressNumber"></div>счастливого Корс-Инга!
Amazon просто разрешил совместное использование ресурсов Cross-Origin, теоретически это позволяет вашим пользователям загружать на S3 напрямую, без использования вашего сервера (и PHP) в качестве прокси.
вот документы ->http://docs.amazonwebservices.com/AmazonS3/latest/dev/cors.html
Они делают большую работу, рассказывая вам, как включить его на ведро S3, но iv не нашел реальных примеров javascript о том, как получить данные от клиента к ведру.
первый человек, чтобы отправить CORS.js это легенда xD
вот пример возобновляемой загрузки файлов на Amazon S3 с использованием CORS и javascripthttp://cotag.github.com/Condominios/
вы можете сделать это с помощью AWS S3 Cognito попробуйте эту ссылку здесь:
http://docs.aws.amazon.com/AWSJavaScriptSDK/guide/browser-examples.html#Amazon_S3
также попробуйте этот код
просто измените регион, IdentityPoolId и Ваше имя ведра
<!DOCTYPE html> <html> <head> <title>AWS S3 File Upload</title> <script src="https://sdk.amazonaws.com/js/aws-sdk-2.1.12.min.js"></script> </head> <body> <input type="file" id="file-chooser" /> <button id="upload-button">Upload to S3</button> <div id="results"></div> <script type="text/javascript"> AWS.config.region = 'your-region'; // 1. Enter your region AWS.config.credentials = new AWS.CognitoIdentityCredentials({ IdentityPoolId: 'your-IdentityPoolId' // 2. Enter your identity pool }); AWS.config.credentials.get(function(err) { if (err) alert(err); console.log(AWS.config.credentials); }); var bucketName = 'your-bucket'; // Enter your bucket name var bucket = new AWS.S3({ params: { Bucket: bucketName } }); var fileChooser = document.getElementById('file-chooser'); var button = document.getElementById('upload-button'); var results = document.getElementById('results'); button.addEventListener('click', function() { var file = fileChooser.files[0]; if (file) { results.innerHTML = ''; var objKey = 'testing/' + file.name; var params = { Key: objKey, ContentType: file.type, Body: file, ACL: 'public-read' }; bucket.putObject(params, function(err, data) { if (err) { results.innerHTML = 'ERROR: ' + err; } else { listObjs(); // this function will list all the files which has been uploaded //here you can also add your code to update your database(MySQL, firebase whatever you are using) } }); } else { results.innerHTML = 'Nothing to upload.'; } }, false); function listObjs() { var prefix = 'testing'; bucket.listObjects({ Prefix: prefix }, function(err, data) { if (err) { results.innerHTML = 'ERROR: ' + err; } else { var objKeys = ""; data.Contents.forEach(function(obj) { objKeys += obj.Key + "<br>"; }); results.innerHTML = objKeys; } }); } </script> </body> </html>при необходимости вы можете использовать GitHub ссылке
Я надеюсь, что это поможет другим :)
для части аутентификации,
нет php кода, нет сервера, нет большого JS кода, кроме как ниже;
вы можете использовать AWS Cognito IdentityPoolId в качестве учетных данных, меньше кода но вам необходимо создать AWS Cognito IdetityPool и прикрепить политику, просто доступ на запись s3.
var IdentityPoolId = 'us-east-1:1...........'; AWS.config.update({ credentials: new AWS.CognitoIdentityCredentials({ IdentityPoolId: IdentityPoolId }) });
Comments