Uploading Image to Amazon s3 with HTML, javascript & jQuery with Ajax Request (No PHP)

前端 未结 5 1316
无人及你
无人及你 2020-11-28 00:48

I am developing a website in HTML, javascript & jQuery. I want to upload images to amazon s3 server in an ajax request. There is no such SDK to integrate s3 in Javascrip

5条回答
  •  余生分开走
    2020-11-28 01:29

    Got Amazon S3 & CORS working on js and html5 using XMLHTTPObject based on this article article.

    1: CORS only works from a proper URL "http://localhost". (file///xyz will make you go insane)

    2 : Make sure you got the POLICY and Secret compiled correctly - here is my policy and this is the link you can get the project to get you started with Signature and Policy -- do not publish this JS with your Secret EVER!

    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);
    

    Here is the JS code

    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 = new XMLHttpRequest();
    
        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://.s3.amazonaws.com/', true); //MUST BE LAST LINE BEFORE YOU SEND 
    
        xhr.send(fd);
      }
    

    Helper functions

    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.");
      }
    

    Then the HTML Form

     

    Happy CORS-ing!

提交回复
热议问题