2017-08-10 258 views
1

我通過我的CMS提交表單,其中包含一個文件選擇器&一些文本。該代碼運行&一個對象在我的S3帳戶中以正確的名稱創建,但已損壞。例如,我正在上傳JPG圖像,但是當我在s3儀表板中查看它們時,我只看到一個黑屏。Node.js上傳到亞馬遜S3的作品,但文件損壞

任何幫助,非常感謝。

我的HTML表單:

<form enctype="multipart/form-data" action="updateSchedule" method="POST"> 
 
     <input type="file" name="schedulepicture" id="schedulepicture"> 
 
     <textarea rows="4" cols="50" id="ScheduleText" name="ScheduleText" maxlength="2000">      <button type="submit" id="updateschedulebutton">Update</button> 
 
</form>

我的Node.js腳本:

router.post('/updateschedule', isLoggedIn, upload.single('schedulepicture'), function(req, res) { 
 
    var scheduleImageToUpload; 
 

 
    //Check if image was uploaded with the form & process it 
 
    if (typeof req.file !== "undefined") { 
 

 
    //Create Amazon S3 specific object 
 
    var s3 = new aws.S3(); 
 
    
 
    //This uploads the file but the file cannot be viewed. 
 
    var params = { 
 
     Bucket: S3_BUCKET, 
 
     Key: req.file.originalname, //This is what S3 will use to store the data uploaded. 
 
     Body: req.file.path, //the actual *file* being uploaded 
 
     ContentType: req.file.mimetype, //type of file being uploaded 
 
     ACL: 'public-read', //Set permissions so everyone can see the image 
 
     processData: false, 
 
     accessKeyId: S3_accessKeyId, 
 
     secretAccessKey: S3_secretAccessKey 
 
    } 
 

 
    s3.upload(params, function(err, data) { 
 
     if (err) { 
 
     console.log("err is " + err); 
 
     } 
 
     res.redirect('../adminschedule'); 
 
    }); 
 
    } 
 
});

回答

1

我相信你需要傳遞一個流而不是文件路徑,你可以像這樣使用fs.createReadStream:

router.post('/updateschedule', isLoggedIn, upload.single('schedulepicture'), function(req, res) { 
    var scheduleImageToUpload; 

    //Check if image was uploaded with the form & process it 
    if (typeof req.file !== "undefined") { 

    //Create Amazon S3 specific object 
    var s3 = new aws.S3(); 
    var stream = fs.createReadStream(req.file.path) 

    //This uploads the file but the file cannot be viewed. 
    var params = { 
     Bucket: S3_BUCKET, 
     Key: req.file.originalname, //This is what S3 will use to store the data uploaded. 
     Body: stream, //the actual *file* being uploaded 
     ContentType: req.file.mimetype, //type of file being uploaded 
     ACL: 'public-read', //Set permissions so everyone can see the image 
     processData: false, 
     accessKeyId: S3_accessKeyId, 
     secretAccessKey: S3_secretAccessKey 
    } 

    s3.upload(params, function(err, data) { 
     if (err) { 
     console.log("err is " + err); 
     } 
     res.redirect('../adminschedule'); 
    }); 
    } 
});