【问题标题】:Node.js upload files to server without additionals frameworksNode.js 将文件上传到服务器,无需额外的框架
【发布时间】:2015-01-03 00:34:24
【问题描述】:

我正在写一个简单的上传网站。我使用XmlHTTPRequest 上传文件。到目前为止,我只体验了这一部分,服务器已经准备好上传文件。但现在我需要制作自己的服务器来在本地测试这个 Web 应用程序。我选择了 Node.js,因为它使用 JavaScript 并且与其他服务器相比显得非常简单。但是,我在使用这个方面不是很有经验,所以我不知道如何从请求中“捕获”上传的文件并将它们保存到我电脑中的某个文件夹中。我一直在努力寻找解决方案,但我发现的每个人都在使用一些框架。如果可能的话,我不想使用这些,因为我不想给我的服务器代码增加任何复杂性,因为它不是我项目的重点,我真的需要它尽可能简单,只是为了测试目的。

那么,你能推荐我一些简单的方法吗?如果您认为没有框架的“清晰”Node.js 并不理想,请随意描述任何其他解决方案,我会尽力理解它:-)


我已经编写了打印一些语句并加载我的源代码的服务器的基本部分:

var http = require('http');
var fs = require('fs');
var path = require('path');

http.createServer(function(request, response) {
    console.log(request.method + ' ' + request.url);
    var filePath = '.' + request.url;
    if (filePath == './')
        filePath = './index.html';
    if (filePath.indexOf('/../') !== -1) {
        response.writeHead(400);
        response.end();
    } else {
        var extname = path.extname(filePath);
        var contentType = 'text/plain';
        switch (extname) {
            case '.js': contentType = 'text/javascript'; break;
            case '.html': contentType = 'text/html'; break;
            case '.css': contentType = 'text/css'; break;
        }
        fs.exists(filePath, function(exists) {
            if (exists) {
                fs.readFile(filePath, function(error, content) {
                    if (error) {
                        response.writeHead(500);
                        response.end();
                    } else {
                        response.writeHead(200, { 'Content-Type': contentType });
                        response.end(content, 'utf-8');
                    }
                });
            } else {
                response.writeHead(404);
                response.end();
            }
        });
    }
}).listen(8080);

【问题讨论】:

  • 为什么要重新发明轮子? Node 是关于库和模块化的。
  • 框架降低了复杂性。它们不会增加复杂性..
  • 好的,你认为 Express 最适合这个还是我应该寻找更好的东西(更简单:-))?我认为使用它们会使我的代码难以理解。
  • 如果我理解得很好,函数 put() 是我要找的吗?我只是将他们的 URL 提供为 request 作为第一个参数。如果我错了,请纠正我。

标签: javascript jquery node.js file-upload


【解决方案1】:

好的,最终我通过使用 fsformidable 以这种方式解决了这个问题。 Web 应用程序和服务器之间的通信是经典的请求-响应,在 Node.js 中非常容易处理。

这里是完整的服务器代码:http://pastebin.com/cmZgSmrL


var fs = require('fs');
var formidable = require('formidable');

    //-----------------------//-------------------------------------------------------------------------------------
    //--- UPLOAD handling ---//
    //-----------------------//
    if (req.url == '/upload' && req.method.toLowerCase() == 'post') {
            var form = new formidable.IncomingForm();

            form.parse(req, function(err, fields, files) {
                    if (err) throw err;

                    fs.readFile( files.filepath.path, function (err, data) {
                            if (err) throw err;

                            var fileName = files.filepath.name;
                            fs.writeFile( __dirname + '/uploadedFiles/' + fileName, data, function (err) {
                                    if (err) throw err;

                                    //-----------------------------------------------//---------------------------------------------
                                    //--- LOAD and APPEND external JSON file with ---//
                                    //--- data from request                       ---//
                                    //-----------------------------------------------//
                                    var jsonObj = require('./storedFilesList.json');

                                    jsonObj[fileName] = {size:files.filepath.size, expDate:'-', path:__dirname + '/uploadedFiles/' + fileName};

                                    var jsonString = JSON.stringify(jsonObj); // convert JSON obj to String

                                    fs.writeFile('storedFilesList.json', jsonString, function(err){
                                            if (err) throw err;
                                            console.log('File ' + fileName + ' was succesfully written to JSON ext file.');
                                    });

                                    console.log('File ' + fileName + ' was succesfully saved.');
                            });
                    });

                    res.writeHead(200, {'content-type': 'text/plain'});
                    res.write('OK');
                    res.end( util.inspect({fields: fields, files: files}) );
            });

            return;
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-21
    • 2021-06-27
    • 2019-07-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多