amazon s3 - How to upload file to Digital Ocean Spaces using Javascript - Stack Overflow

I am looking to use Digital Oceans spaces (which seems to have an identical API to S3), and would like

I am looking to use Digital Oceans spaces (which seems to have an identical API to S3), and would like to try it by uploading a sample file. I am having lots of difficulty. Here's what I've done so far

{'hi' : 'world'}

Is the contents of a file hiworld.json that I would like to upload. I understand that I need to create an aws v4 signature before I can make this request.

var aws4 = require('aws4') var request = require('request')

var opts = {'json': true,'body': "{'hi':'world'}",host: '${myspace}.nyc3.digitaloceanspaces', path: '/hiworld.json'}

aws4.sign(opts, {accessKeyId: '${SECRET}', secretAccessKey: '${SECRET}'})

Then I send the request

request.put(opts,function(error, response) {
    if(error) {
        console.log(error);
    }
    console.log(response.body);
});

However, when I check my Digital Ocean space, I see that my file was not created. I have noticed that if I changed my PUT to GET and try to access an existing file, I have no issues.

Here's what my headers look like

headers: { Host: '${myspace}.nyc3.digitaloceanspaces', 'Content-Type': 'application/x-www-form-urlencoded; charset=utf-8', 'Content-Length': 14, 'X-Amz-Date': '20171008T175325Z', Authorization: 'AWS4-HMAC-SHA256 Credential=${mykey}/20171008/us-east-1//aws4_request, SignedHeaders=content-length;content-type;host;x-amz-date, Signature=475e691d4ddb81cca28eb0dcdc7c926359797d5e383e7bef70989656822accc0' }, method: 'POST' }

I am looking to use Digital Oceans spaces (which seems to have an identical API to S3), and would like to try it by uploading a sample file. I am having lots of difficulty. Here's what I've done so far

{'hi' : 'world'}

Is the contents of a file hiworld.json that I would like to upload. I understand that I need to create an aws v4 signature before I can make this request.

var aws4 = require('aws4') var request = require('request')

var opts = {'json': true,'body': "{'hi':'world'}",host: '${myspace}.nyc3.digitaloceanspaces.', path: '/hiworld.json'}

aws4.sign(opts, {accessKeyId: '${SECRET}', secretAccessKey: '${SECRET}'})

Then I send the request

request.put(opts,function(error, response) {
    if(error) {
        console.log(error);
    }
    console.log(response.body);
});

However, when I check my Digital Ocean space, I see that my file was not created. I have noticed that if I changed my PUT to GET and try to access an existing file, I have no issues.

Here's what my headers look like

headers: { Host: '${myspace}.nyc3.digitaloceanspaces.', 'Content-Type': 'application/x-www-form-urlencoded; charset=utf-8', 'Content-Length': 14, 'X-Amz-Date': '20171008T175325Z', Authorization: 'AWS4-HMAC-SHA256 Credential=${mykey}/20171008/us-east-1//aws4_request, SignedHeaders=content-length;content-type;host;x-amz-date, Signature=475e691d4ddb81cca28eb0dcdc7c926359797d5e383e7bef70989656822accc0' }, method: 'POST' }

Share Improve this question asked Oct 8, 2017 at 18:12 user2202911user2202911 3,0145 gold badges22 silver badges32 bronze badges 0
Add a ment  | 

3 Answers 3

Reset to default 4

As an alternative, using aws-sdk:

// 1. Importing the SDK
import AWS from 'aws-sdk';

// 2. Configuring the S3 instance for Digital Ocean Spaces 
const spacesEndpoint = new AWS.Endpoint(
  `${REGION}.digitaloceanspaces.`
);
const url = `https://${BUCKET}.${REGION}.digitaloceanspaces./${file.path}`;
const S3 = new AWS.S3({
  endpoint: spacesEndpoint,
  accessKeyId: ACCESS_KEY_ID,
  secretAccessKey: SECRET_ACCESS_KEY
});

// 3. Using .putObject() to make the PUT request, S3 signs the request
const params = { Body: file.stream, Bucket: BUCKET, Key: file.path };
S3.putObject(params)
  .on('build', request => {
    request.httpRequest.headers.Host = `https://${BUCKET}.${REGION}.digitaloceanspaces.`;
    // Note: I am assigning the size to the file Stream manually
    request.httpRequest.headers['Content-Length'] = file.size;
    request.httpRequest.headers['Content-Type'] = file.mimetype;
    request.httpRequest.headers['x-amz-acl'] = 'public-read';
  })
  .send((err, data) => {
    if (err) logger(err, err.stack);
    else logger(JSON.stringify(data, '', 2));
  });
var str = {
    'hi': 'world'
}

var c = JSON.stringify(str);

request(aws4.sign({
  'uri': 'https://${space}.nyc3.digitaloceanspaces./newworlds.json',
  'method': 'PUT',
  'path': '/newworlds.json',
  'headers': {
    "Cache-Control":"no-cache",
    "Content-Type":"application/x-www-form-urlencoded",
    "accept":"*/*",
    "host":"${space}.nyc3.digitaloceanspaces.",
    "accept-encoding":"gzip, deflate",
    "content-length": c.length
  },
  body: c
},{accessKeyId: '${secret}', secretAccessKey: '${secret}'}),function(err,res){
    if(err) {
        console.log(err);
    } else {
        console.log(res);
    }
})

This gave me a successful PUT

It can be done using multer and aws sdk. It worked for me.

const aws = require('aws-sdk');
const multer = require('multer');
const express = require('express');
const multerS3 = require('multer-s3');
const app = express();

const spacesEndpoint = new aws.Endpoint('sgp1.digitaloceanspaces.');
const spaces = new aws.S3({
endpoint: spacesEndpoint,
accessKeyId: 'your_access_key_from_API',
secretAccessKey: 'your_secret_key'
 });


const upload = multer({
storage: multerS3({
s3: spaces,
bucket: 'bucket-name',
acl: 'public-read',
key: function (request, file, cb) {
  console.log(file);
  cb(null, file.originalname);
   }
 })
 }).array('upload', 1);

Now you can also call this using an API like this

app.post('/upload', function (request, response, next) {
upload(request, response, function (error) {
if (error) {
  console.log(error);

}
console.log('File uploaded successfully.');

   });
  });

HTML would look like this

<form method="post" enctype="multipart/form-data" action="/upload">
<label for="file">Upload a file</label>
<input type="file" name="upload">
<input type="submit" class="button">
</form>

发布者:admin,转转请注明出处:http://www.yc00.com/questions/1742318763a4421378.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信