我正在学习nodejs,并对上传的文件使用multer、ajax jquery,但我感到有点困惑。假设我在html文件中有这个代码
<form action="/" method='post' enctype="multipart/form-data" id='form-data'>
<input type="file" name='file' id='file' class='file'>
</form>
和脚本:
<script>
$(document).on('change', '#file', function () {
var property = document.getElementById('file').files[0];
var form_data = new FormData();
form_data.append('file', property);
$.post({
url: '/',
type: 'post',
data: form_data,
contentType: false,
cache: false,
processData: false,
success: function (data) {
console.log(data);
}
})
})
</script>
在server.js(服务器端(中,我有这样的代码:
var storage = multer.diskStorage({
destination: function (req, file, cb) {
cb(null, 'uploads')
},
filename: function (req, file, cb) {
cb(null, Date.now() + path.extname(file.originalname))
}
})
var upload = multer({ storage: storage })
app.post('/', upload.single('file'), (req,res) =>{
console.log(req.body);
console.log(req.file);
})
此代码运行平稳。但这个问题困扰着我:
在脚本的第9行,如果我使用";数据:属性";而不是";data:form_ data";,它不再工作,req.file为空。为什么我们不能直接传递变量"属性";转换为数据,但必须使用对象FormData才能执行此操作?
Multer用于解析使用multipart/form-data
格式编码的数据(该格式由用边界标记分隔的任意数量的数据位(如文件和文本片段(组成(。
FormData API允许您收集不同的数据片段,包括文件,并使用它们生成multipart/form-data
。
如果您直接将property
的值传递给jQuery,那么您将发送文件,该文件可能是text/plain
或image/png
,或者几乎是任何东西,而不需要任何进一步的编码。它不太可能是multipart/form-data
,因为人们通常不会以这种格式存储数据。
您可以编写需要原始文件的服务器端代码,但如果这样做,就不会使用Multer。