2015-08-15 79 views
2

我正在使用multer将文件上载到服务器。除了multer文档中实际提到的一个问题外,一切正常。这里是摘录:使用Multer存储对象

“请注意,req.body可能尚未完全填充”(意思是当存储对象文件名函数被称为我猜...)。 “这取决于客户端传输字段和文件到服务器的顺序”

这正是我的问题所在。我确实确认了req.body.ID将其发送给服务器,但在multer定义了文件的名称之后,它被填充。

有没有人有任何建议如何处理这个问题?这里是我的代码片段(文件名最终被 “未定义” 用正确的JPG扩展名):

//Storage object 
var storage = multer.diskStorage({ 
    destination: './uploaded', 
    filename: function(req, res, cb) { 
    cb(null, req.body.ID + '.jpg') 
    } 
}); 

//File Upload Handle 
router.post('/file-upload', upload.single('image'), function(req, res, next) { 
    console.log("routes module-/file-upload " + req.body.ID); // The file ID gets transmitted 
    res.sendStatus(201); 
}); 

这里是我的HTML:

<form id="fileForm" enctype="multipart/form-data" > 

    <div class="form-group"> 
     <input id='name' name="name" placeholder="ID" class="form-control-label"> 
    </div> 

    <div class="form-group" align="center"> 
     <input type="file" id="file" name="image"> 
    </div> 

<button type="submit" class="btn btn-warning" value="Upload">Upload</button> 

</form> 

和前端AJAX:

//Testing Files Uploads 
$("#fileForm").on('submit', function(event) { 
    event.preventDefault(); 
    var formData = new FormData(this); 
    var fileID = $('#name').val(); 
    formData.append("ID", fileID); 

    $.ajax('/file-upload', { 
     type: 'POST', 
     data: formData, 
     processData: false, 
     contentType: false, 
    }) 
    .done(function(item) { 
     console.log('Uploaded!'); 
    }) 
    .error(function() { 
     console.log('doesnt work!') 
    }); 
}); 

//End of Files Uploads 
+0

您可能会在客户端添加表单提交的内容(尤其是HTML表单,如果您使用的话)。 – mscdex

+0

好的建议,谢谢,HTML表单很简单,现在添加它 – pastrop

+0

@pastrop:你还可以发布你如何分配上面的存储对象到multer吗?例如: var upload = multer({storage:storage}); app.post('/ profile',upload.single('uploadedFile'),函数( – pkamathk

回答

0

我认为req.body.ID是不正确的。你很可能试图使用req.body.name? 当我使用你的例子时,我也得到了Undefined.jpg。但使用.name,我得到了正确的文件名

0

可能会有点迟到了,但我遇到的具体问题,因为你。我通过将文件保存到临时位置来缓解问题,并在回调函数中将上述函数移动(重命名)到所需的位置。