Итак, сначала вы должны создать папку для каждого пользователя с помощью fs.mkdir
:
http://nodejs.org/api/fs.html#fs_fs_mkdir_path_mode_callback
Допустим, вы хотите создать эти папки в ваши приложения корневой/изображений:
Пример:
var fs = require('fs');
fs.mkdir(__dirname + '/images/' + userId, function(err) {
if (err) {
/* log err etc */
} else {
/* folder creation succeeded */
}
});
Возможно, вы используете userId
для имени папки (поскольку это easie r, чем пытаться вычеркнуть плохие символы из самого имени пользователя, и это также будет работать в будущем, если пользователь изменит свое имя пользователя).
Второе, что вам нужно сделать, это разрешить пользователю загружать файлы (но только если он зарегистрирован и находится в правой папке). Это лучше не включать bodyParser
промежуточное программное обеспечение для всех маршрутов, но вместо того, чтобы включать в себя промежуточное программном обеспечении json
& & urlencoded
для всех маршрутов (http://www.senchalabs.org/connect/json.html & & http://www.senchalabs.org/connect/urlencoded.html) и multipart
промежуточного программного обеспечения только для URL загрузки (http://www.senchalabs.org/connect/multipart.html & & примера: https://github.com/visionmedia/express/blob/master/examples/multipart/index.js).
Пример:
app.post('/images', express.multipart({ uploadDir: '/tmp/uploads' }), function(req, res, next) {
// at this point the file has been saved to the tmp path and we need to move
// it to the user's folder
fs.rename(req.files.image.path, __dirname + '/images/' + req.userId + '/' + req.files.image.name, function(err) {
if (err) return next(err);
res.send('Upload successful');
});
});
Примечание: в приведенном выше примере, я принял во внимание, что req.userId
заполняется с идентификатором пользователя по Идент с ППО.
Показаны изображения пользователя, если он имеет право видеть им (Auth промежуточный слой следует применять для этого пути, а):
app.get('/images/:user/:file', function(req, res, next) {
var filePath = __dirname + '/images/' + req.userId + '/' + req.params.file;
fs.exists(filePath, function(exists) {
if (!exists) { return res.status(404).send('Not Found'); }
// didn't attach 'error' handler here, but you should do that with streams always
fs.createReadStream(filePath).pipe(res);
});
});
Примечания: в производстве вы можете использовать послать вместо , этот пример просто демонтировал поток (https://github.com/visionmedia/send).
использовать ['fs.exists'] (http://nodejs.org/api/fs.html#fs_fs_exists_path_callback), [' fs.mkdir'] (http://nodejs.org/api/fs.html #fs_fs_mkdir_path_mode_callback) и один из ['fs.createWriteStream'] (http://nodejs.org/api/fs.html#fs_fs_createwritestream_path_options) или [' fs.write'] (http://nodejs.org/api/ fs.html # fs_fs_write_fd_buffer_offset_length_position_callback). обязательно проверьте, что я не могу написать, например. '../../../../ ../ etc/passwd', потому что это было бы довольно ужасно для безопасности вашего сайта. – Plato
Как кто-то сможет написать этот файл через мой webapp? Я думал, что каталог, в который файлы могут быть загружены, контролируется мной? – Swarage
, например. если вы позволили им установить имя файла, он мог бы назвать его так, чтобы он был помещен в '/ your/directory/theirfolder /../../../../../ etc/passwd'. я не уверен, какие шаги вы должны предпринять, если таковые имеются, для очистки такого имени файла. ради безопасности я бы назвал это чем-то случайным и сохранил отображение (имена файлов на вашем жестком диске) по сравнению с (отображаемыми именами объектов в замке) – Plato