質問のタイトルで説明されているように、アップロードされたファイルをファイル拡張子に基づいてフィルタリングする必要があります。それで、公式ドキュメントを調べてこのウェブサイトを検索しました。
私が試したこと
私は出会った解決策を試しました。ファイルは正常にアップロードされていますが、問題はファイルのフィルタリング方法です。現在、Router.jsファイルは次のようになっています。
Router.JS
var multer = require('multer');
var storage = multer.diskStorage({ //multers disk storage settings
destination: function (req, file, cb) {
cb(null, './public/uploads/')
},
limits:{
files: 1,
fileSize: 1024 * 1024
},
filename: function (req, file, cb) {
var datetimestamp = Date.now();
cb(null, file.fieldname + '-' + datetimestamp + '.' + file.originalname.split('.')[file.originalname.split('.').length -1])
},
onFileUploadStart: function(file) {
console.log("Inside uploads");
if (file.mimetype == 'image/jpg' || file.mimetype == 'image/jpeg' || file.mimetype == 'image/png') {
return true;
}
else
{
return false;
}
}
});
var upload = multer({ //multer settings
storage: storage
}).single('profilepic');
router.post('/profile', function(req, res){
upload(req,res,function(err){
if(err)
{
console.log(err);
}
else
{
console.log("Image was uploaded");
}
});
});
onFileUploadStart
にエコーして、その関数に含まれているかどうかを確認しました。そして、そうではありませんでした。 onFileUploadStart
のほかに、この link で述べたようにfileFilter
も試しましたが、役に立ちませんでした。これを解決する方法の提案はありますか?前もって感謝します。
multer
の使用例:
var storage = multer.diskStorage({ //multers disk storage settings
destination: function (req, file, cb) {
cb(null, './public/uploads/')
},
filename: function (req, file, cb) {
var datetimestamp = Date.now();
cb(null, file.fieldname + '-' + datetimestamp + '.' + file.originalname.split('.')[file.originalname.split('.').length -1])
}
});
var upload = multer({ //multer settings
storage: storage,
fileFilter: function (req, file, callback) {
var ext = path.extname(file.originalname);
if(ext !== '.png' && ext !== '.jpg' && ext !== '.gif' && ext !== '.jpeg') {
return callback(new Error('Only images are allowed'))
}
callback(null, true)
},
limits:{
fileSize: 1024 * 1024
}
}).single('profilepic');
Node.js-File upload から抜粋。元の作者は Iceman および Mikhail でした。帰属の詳細は contributor page にあります。ソースは CC BY-SA 3. でライセンスされており、 Documentation archive にあります。参照トピックID:4080、サンプルID:14210。
これは非常に役立ちますありがとうございます。私の場合、ミドルウェアを追加してJWTokenが適切に配置されていることを確認し、それを[〜#〜] xhr [〜#〜]。他の誰かがこれについて助けを必要としているなら、ここが私にとってうまくいきました。これは、XHRヘッダーでトークンを渡すときに簡単に実行できます。
クライアント:
const loadHandler = event =>{
// loadHandler mandate
}
const errorHandler = event => {
// error mandate
}
const abortHandler = event => {
// abort mandate
}
const data = new FormData()
data.append('file', upFile)
var formData = new FormData();
var xhr = new window.XMLHttpRequest();
formData.append('files', upFile); // this is a state object set onChange
xhr.open('post', '/uploadFile', true);
xhr.setRequestHeader('token', thetoken); // Passing token in header
xhr.addEventListener("load", loadHandler, false);
xhr.addEventListener("error", errorHandler, false);
xhr.addEventListener("abort", abortHandler, false);
xhr.send(formData);
サーバ
const express = require('express'),
app= express.Router(),
rf = require('./RoutFuctions');
...
app.post('/uploadFile', rf.verifyToken, function (req, res, next) {
// upload portion above
});
RoutFunctions.js
const jwt = require('jsonwebtoken')
const tokenTest = (token, res, jwt, caller, next) => {
jwt.verify(token, process.env.SECRET_KEY, err => {
if(err) {
res.sendStatus(403);
console.log('could not verify token');
} else {
console.log("token verified");
next(); // Next middleware
}
});
}
exports.verifyToken = function(req, res, next) {
if(req.body.token !== undefined) { // non upload scenario
var caller = ''
if(req.body.caller !== undefined) caller = req.body.caller;
tokenTest(req.body.token, res, jwt, caller, next)
} else { // attempt to extract token in XHR header upload scenario
if(req.headers.token !== undefined){
var token = req.headers.token
tokenTest(req.headers.token, res, jwt, caller, next)
} else {
res.sendStatus(403);
}
}
}