2013-11-15 4 views
1

У меня есть express.js app, и я использую гипсокартон, чтобы управлять пользовательской системой.express.js уникальный каталог для каждого пользователя

Когда пользователь подписывается, я хочу, чтобы для этого пользователя была создана директория, и я хочу, чтобы этот пользователь мог загружать файлы в этот каталог и просматривать эти файлы через свою учетную запись.

Я не совсем уверен, но я думаю, что, скорее всего, для генерации каталогов мне придется делать это внутри views/signup/index.js, и что пользователь может загружать файлы только в свой каталог, если он зарегистрирован in

Однако, я немного застреваю, когда дело доходит до сохранения и отображения файлов. У меня мало опыта с кодом на стороне сервера, поэтому реализация таких действий, как доступ к файлам, немного выше моей.

Заранее благодарю тех, кто помогает.

+0

использовать ['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

+0

Как кто-то сможет написать этот файл через мой webapp? Я думал, что каталог, в который файлы могут быть загружены, контролируется мной? – Swarage

+0

, например. если вы позволили им установить имя файла, он мог бы назвать его так, чтобы он был помещен в '/ your/directory/theirfolder /../../../../../ etc/passwd'. я не уверен, какие шаги вы должны предпринять, если таковые имеются, для очистки такого имени файла. ради безопасности я бы назвал это чем-то случайным и сохранил отображение (имена файлов на вашем жестком диске) по сравнению с (отображаемыми именами объектов в замке) – Plato

ответ

1

Итак, сначала вы должны создать папку для каждого пользователя с помощью 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).

Смежные вопросы