Nodejs:为什么我们需要传递一个对象FormData,这样multer就可以很好地工作(使用ajax jquery上



我正在学习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/plainimage/png,或者几乎是任何东西,而不需要任何进一步的编码。它不太可能是multipart/form-data,因为人们通常不会以这种格式存储数据。

您可以编写需要原始文件的服务器端代码,但如果这样做,就不会使用Multer。

相关内容

最新更新