Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js Axios从URL获取文件并上传到s3_Node.js_Amazon S3_Axios - Fatal编程技术网

Node.js Axios从URL获取文件并上传到s3

Node.js Axios从URL获取文件并上传到s3,node.js,amazon-s3,axios,Node.js,Amazon S3,Axios,我正在尝试使用axios.get从站点获取文件,然后将其直接上载到S3。但是,文件已损坏或编码不正确,上传后无法打开。文件类型范围从.jpg、.png到.pdf。这是我的密码: axios.get(URL, { responseEncoding: 'binary', responseType: 'document', }).then((response) => { return new Promise((resolve, reject) => { const s3

我正在尝试使用axios.get从站点获取文件,然后将其直接上载到S3。但是,文件已损坏或编码不正确,上传后无法打开。文件类型范围从.jpg、.png到.pdf。这是我的密码:

axios.get(URL, {
  responseEncoding: 'binary',
  responseType: 'document',
}).then((response) => {
  return new Promise((resolve, reject) => {
    const s3Bucket = nconf.get('AWS_S3_BUCKET');

    s3.upload({
      'ACL': 'public-read',
      'Body': response.data,
      'Bucket': s3Bucket,
      'Key': `static/${filePath}/${fileManaged.get('filename')}`,
    }, function(err) {
      if (err) {
        return reject(err);
      }
    });
  });
});
const AWS = require('aws-sdk');
const axios = require('axios');

/**
 * saveImage              saves an image file into s3
 * @param {*} fullname    absolute path and file name of the file to be uploaded
 * @param {*} filecontent buffer of the image file
 */
var uploadFile = async function (s3_creds, fullname, filecontent, filetype) {
    const s3 = new AWS.S3(s3_creds);
    return new Promise((resolve, reject) => {
        // Add a file to a Space
        
        var params = {
            Key: fullname, // absolute path of the file
            Body: filecontent, 
            Bucket: "docserpcloud",
            ACL: "public-read", // or private
            ContentEncoding: 'binary', 
            ContentType: filetype 
        };
        // console.log(params)
        s3.putObject(params, function (err, data) {
            if (err) {
                console.log(err, err.stack);
                reject(err)
            } else {
                resolve(data);
                console.log(data);
            }
        });
    })
}

var getFilefromURL = async function (imageuri) {
    // console.log (imageuri)
    return new Promise((resolve, reject) => {
        try {
            axios.get(encodeURI(imageuri), {
                responseType: "arraybuffer"
            }).then((response) => {
                resolve(response)
            })
        } catch (err) {
            reject(err)
        }
    })
}


/**
 * saveImageFromUrl    gest a file from an url and saves a copy on s3 bucket
 * @param {*} imageuri full URL to an image
 * @param {*} fullname absolute path and filename of the file to be writen on s3
 */
var saveFileFromUrl = async function (s3_creds, imageuri, fullname) {
    return new Promise((resolve, reject) => {
        getFilefromURL(imageuri).then(image => {
            // console.log(image.res)
            uploadFile(s3_creds, fullname, Buffer.from(image.data, 'utf8'), image.headers['content-type']).then(s3response => {
                resolve(s3response)
            }).catch(err => {
                reject(err)
            })
        }).catch(err => {
            reject(err)
        })
    })
}


module.exports = {
    uploadFile: uploadFile,
    getFilefromURL: getFilefromURL,
    saveFileFromUrl: saveFileFromUrl
}

 async function main() {
     try {
         var s3_creds = {
             "accessKeyId": "acessid",
             "endpoint": "xxxx.digitaloceanspaces.com",
             "secretAccessKey": "Vttkia0....."
         };
         await saveFileFromUrl(s3_creds, "https://gitlab.com/qtree/erpcloud_logos/-/raw/master/pdf_logo2.png?inline=true", 'media/pddd.png');
     } catch {}
 }

main();

我尝试将
responseType
修改为
arraybuffer
,并使用
buffer.from(response.data,'binary').toString('base64')
创建一个缓冲区,但没有成功。我遗漏了什么?

Axios用utf8编码响应体。

您应该使用其他库,如
request

我可以通过使用
arraybuffer
.putObject
函数而不是
.upload
使它工作

axios.get(encodeURI(url), {
  responseType: 'arraybuffer',
}).then((response) => {

徐约翰的回答是正确的。但在我的例子中,我必须添加:Buffer.from(image.data,'utf8'),如上所述,以便获得与请求-响应类似的正确缓冲区。这是我的密码:

axios.get(URL, {
  responseEncoding: 'binary',
  responseType: 'document',
}).then((response) => {
  return new Promise((resolve, reject) => {
    const s3Bucket = nconf.get('AWS_S3_BUCKET');

    s3.upload({
      'ACL': 'public-read',
      'Body': response.data,
      'Bucket': s3Bucket,
      'Key': `static/${filePath}/${fileManaged.get('filename')}`,
    }, function(err) {
      if (err) {
        return reject(err);
      }
    });
  });
});
const AWS = require('aws-sdk');
const axios = require('axios');

/**
 * saveImage              saves an image file into s3
 * @param {*} fullname    absolute path and file name of the file to be uploaded
 * @param {*} filecontent buffer of the image file
 */
var uploadFile = async function (s3_creds, fullname, filecontent, filetype) {
    const s3 = new AWS.S3(s3_creds);
    return new Promise((resolve, reject) => {
        // Add a file to a Space
        
        var params = {
            Key: fullname, // absolute path of the file
            Body: filecontent, 
            Bucket: "docserpcloud",
            ACL: "public-read", // or private
            ContentEncoding: 'binary', 
            ContentType: filetype 
        };
        // console.log(params)
        s3.putObject(params, function (err, data) {
            if (err) {
                console.log(err, err.stack);
                reject(err)
            } else {
                resolve(data);
                console.log(data);
            }
        });
    })
}

var getFilefromURL = async function (imageuri) {
    // console.log (imageuri)
    return new Promise((resolve, reject) => {
        try {
            axios.get(encodeURI(imageuri), {
                responseType: "arraybuffer"
            }).then((response) => {
                resolve(response)
            })
        } catch (err) {
            reject(err)
        }
    })
}


/**
 * saveImageFromUrl    gest a file from an url and saves a copy on s3 bucket
 * @param {*} imageuri full URL to an image
 * @param {*} fullname absolute path and filename of the file to be writen on s3
 */
var saveFileFromUrl = async function (s3_creds, imageuri, fullname) {
    return new Promise((resolve, reject) => {
        getFilefromURL(imageuri).then(image => {
            // console.log(image.res)
            uploadFile(s3_creds, fullname, Buffer.from(image.data, 'utf8'), image.headers['content-type']).then(s3response => {
                resolve(s3response)
            }).catch(err => {
                reject(err)
            })
        }).catch(err => {
            reject(err)
        })
    })
}


module.exports = {
    uploadFile: uploadFile,
    getFilefromURL: getFilefromURL,
    saveFileFromUrl: saveFileFromUrl
}

 async function main() {
     try {
         var s3_creds = {
             "accessKeyId": "acessid",
             "endpoint": "xxxx.digitaloceanspaces.com",
             "secretAccessKey": "Vttkia0....."
         };
         await saveFileFromUrl(s3_creds, "https://gitlab.com/qtree/erpcloud_logos/-/raw/master/pdf_logo2.png?inline=true", 'media/pddd.png');
     } catch {}
 }

main();
更新s3_creds以适合您的凭据,并运行它以上载pdf徽标

问候,,
Enrique

我一直在stackoverflow各地搜索,谢天谢地你的答案奏效了!