FormDataとMultierが使用する小さな穴
7412 ワード
正しいコードを先に
HTML 5のFormDataはnode.jsミドルウェアmulter実装ピクチャアップロードで発生した問題:ページのformオブジェクトを直接FormDataに転送する構造方法でバックエンドに転送し、multerはファイルオブジェクトを取得できない.Multierアドレスサービス側コード
クライアントコード
問題
フロントエンドコードが上に書かれている場合、バックエンドmulterはファイルを取得できません.なぜなら、fileがHTML InputElementオブジェクトに含まれているため、multerはinputオブジェクトの内部を再帰的に便利にしません.
解決する
Inputのfiles属性でfileオブジェクトを取り出し、appendメソッドFormDataでバックエンドに転送
HTML 5のFormDataはnode.jsミドルウェアmulter実装ピクチャアップロードで発生した問題:ページのformオブジェクトを直接FormDataに転送する構造方法でバックエンドに転送し、multerはファイルオブジェクトを取得できない.Multierアドレスサービス側コード
const router = require('express').Router();
const multer=require('multer');
const storage = multer.diskStorage({
destination: function (req, file, cb) {
cb(null, '../likeread/uploads')
},
filename: function (req, file, cb) {
cb(null, file.fieldname + '-' + Date.now())
}
})
router.post('/fileUpload',upload.any(),(req,res)=>{
var file=req.files[0];
res.send(file.path);
});
クライアントコード
var target=event.target;
var NFileInput=transparentDiv.querySelector('[id="nurl"]');
var LRFileInput=transparentDiv.querySelector('[id="lrurl"]');
var FileInput=document.querySelector('input[id="displayFileInput"]');
var formData;
if(window.FormData){
formData=new FormData();
}else{
alert('your browser not supported FormData');
}
if(NFileInput.style.display==='none'){
formData.appned('lrFileURL',LRFileInput);
}else{
formData.append('nFileName',NFileInput);
var file=FileInput.files[0];
formData.append(file.name,file);
}
//URL
httpRquest(self,'POST',self.URL,true,formData,'multipart/form-data');
var xhr;
function httpRquest(self,Method,URL,ASYN,Data){
// xhr
if(window.XMLHttpRequest){
xhr=new XMLHttpRequest();
}
else if(window.ObjectActive){
try{
xhr=new ObjectActive('Microsoft.XMLHTTP');
}catch(e){
try{
xhr=new ObjectActive('Ms2.XHLHTTP');
}catch(e){
alert(' AJAX, !');
}
}
}
xhr.open(Method,URL,ASYN);
xhr.send(Data);
//
xhr.onreadystatechange=function(){
if(xhr.readyState===XMLHttpRequest.DONE&&xhr.status===200){
self.imageURL=xhr.responseText;
}
}
}
Object.defineProperty(this,'imageURL',{
enumerable:true,
configurable:true,
get:function(){
return this.imageURL;
},
set:function(newVal){
this.value=newVal;
oldClickEvent.url=newVal;
document.body.removeChild(transparentDiv);// BombBox
var event=new Event('click',{"bubbles":true,"cancelable":true});//oldClick simplemde , event
oldClickEvent(event);
}
});
問題
type="file">
formData.append('filename',document.querySelector('input[type=file]'));
xhr.send(formData);
フロントエンドコードが上に書かれている場合、バックエンドmulterはファイルを取得できません.なぜなら、fileがHTML InputElementオブジェクトに含まれているため、multerはinputオブジェクトの内部を再帰的に便利にしません.
解決する
type="file">
formData.append('filename',document.querySelector('input[type=file]').files[0]);
xhr.send(formData);
Inputのfiles属性でfileオブジェクトを取り出し、appendメソッドFormDataでバックエンドに転送