Node.js上传文件到服务器没有加法框架 [英] Node.js upload files to server without additionals frameworks

查看:232
本文介绍了Node.js上传文件到服务器没有加法框架的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在写一个简单的上传网站。我使用 XmlHTTPRequest 上传文件。到目前为止,我只经历了这个部分,服务器已经准备好文件上传。但现在我需要制作自己的服务器在本地测试这个Web应用程序。我选择了Node.js,因为它使用JavaScript并且与其他服务器相比显得非常简单。但是,我还不是很有经验,所以我不知道如何从请求中抓取上传的文件,并将它们保存到我的电脑中的某个文件夹中。我一直在试图找到一个解决方案,但我发现每个人都在使用一些框架。如果可能的话,我不想使用这些,因为我不想为我的服务器代码添加任何复杂性,因为这不是我项目的主要内容,我只是为了测试目的而需要它是最简单的。那么,你能否推荐我一些简单的方法来做到这一点?如果你觉得那个没有框架的明确的Node.js不是很理想的话,可以随意描述任何其他的解决方案,我会尽我所能去理解它: - )



< hr>

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

pre > var http = require('http');
var fs = require('fs');
var path = require('path');
$ b $ 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);


解决方案

使用 fs 强大的。 Web应用程序和服务器之间的通信是一个经典的请求响应,在Node.js中处理起来非常简单。

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




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

// ----------------------- // --------------- -------------------------------------------------- --------------------
// ---上传处理--- //
// -------- --------------- //
if(req.url =='/ upload'&&& req.method.toLowerCase()=='post'){
var form = new formidable.IncomingForm();
$ b form.parse(req,function(err,fields,files){
if(err)throw err;

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

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

// ----------------- ------------------------------ // ------------------ ---------------------------
// ---使用--- // $ b加载和附加外部JSON文件$ b // ---来自请求的数据--- //
// ----------------------------- ------------------ //
var jsonObj = require('./ s toredFilesList.json);

jsonObj [fileName] = {size:files.filepath.size,expDate:' - ',路径:__ dirname +'/ uploadedFiles /'+ fileName};

var jsonString = JSON.stringify(jsonObj); //将JSON obj转换为String
$ b fs.writeFile('storedFilesList.json',jsonString,function(err){
if(err)throw err;
console.log ('File'+ fileName +'已成功写入JSON ext文件');
});

console.log('File'+ fileName +'已成功保存');
});
});

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

return;
}


I'm writing a simple uploading website. I use XmlHTTPRequest to upload files. Until now I've experienced only this part, with server already prepared for file uploading. But now I need to make my own server to test this web app locally. I've chosen Node.js, because it uses JavaScript and appears quite simple in comparison to other servers. But still, I'm not very experienced in using this, so I don't know, how to "catch" uploaded files from request and save them to some folder located in my PC. I've been trying to find a solution, but every one I've found is using some framework. I don't want to use these, if possible, because I don't want to add any complexity to my server code, since it's not the main point of my project and I need it really the simplest possible, just for testing purposes.

So, could you please recommend me some easy way to do this? If you think, that "clear" Node.js without frameworks is not ideal, feel free to describe any other solution, I'll try my best to understand it :-)


I've written the basic part of the server which print some statements and loads my source codes:

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);

解决方案

Ok, eventually I've solved it this way, with use of fs and formidable. The communication between web app and server is a classical request-response, it's very easy to handle in Node.js.

Here is the full server code: 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;
    }

这篇关于Node.js上传文件到服务器没有加法框架的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆