服务器上安装node.js,刚好要写一个简单的下载功能。记录!
在此之前,确保你已经安装了Node(并且你很会折腾) - 有人说,Java脚本和Java最本质的区别就是一个超会更新,一个死守旧。
如果你没有安装,请去官网下载并且安装:http://nodejs.cn/download/
中文文档:http://nodejs.cn/api/
先来说说node的优点以及缺点
粗略的来说node的优点即在于它是单线程、运行环境要求低,缺点同样明显的就是它一旦出现问题,全部瘫痪。
而php和java是多线程运行的,互不影响,但占资源高。
看一个小例子(随便写的,读取参数后返回下载地址,客户端使用地址下载即可。)
var http = require('http'); var url = require("url"); var querystring = require("querystring"); http.createServer(function(request, response) { //获取返回的url对象的query属性值 let arg = url.parse(request.url).query; //将arg参数字符串反序列化为一个对象 let params = querystring.parse(arg); // 发送 HTTP 头部 // HTTP 状态值: 200 : OK // 内容类型: text/plain response.writeHead(200, { 'Content-Type': 'text/plain' }); // 发送响应数据 "Hello World" response.end(JSON.stringify(params)); }).listen(8080);
启动服务
[root@izbp17v35sjxegx358edr9z www]# node server.js Server running at http://127.0.0.1:8080/
通过地址访问即可。
网上摘录例子,仅供参考
提供一个测试js代码.. 浏览器通过get请求 http://127.0.0.1:20000/upload.do?filePath=XXXX即可触发上传过程
var express = require('express'); var url = require('url'); var fs = require('fs'); var http = require('http'); var queryString = require('querystring'); var bodyParser = require('body-parser'); var app = express(); app.use(bodyParser.json({limit:'1000kb'})); app.use(bodyParser.urlencoded({limit:'1000kb',extended:true})); var count=0; app.get('/upload.do',function(req,resp){ console.log('upload.do'); //var path = url.parse(req.url).pathname; //console.log('Request for ' + path); var filePath = req.query.filePath; //var fileData = req.query.fileData; var address = req.query.address; upload(filePath,'127.0.0.1',20001); console.log('*** ' + ++count +' ***'); var response = { "first":req.query.filePath, "last":req.query.address }; resp.end(JSON.stringify(response)); }); function upload(filePath,address,port){ var Data = readFile(filePath); var dataBase64 = Data.toString('base64'); console.log(Data); console.log(dataBase64); //var DataJSON = JSON.stringify(Data); //fs.writeFile('D:/input.txt',dataBase64,function(err){ // if(err){ // console.err(err); // } //}); var JsonData = queryString.stringify({ filePath:filePath, fileData:dataBase64 }); //console.log(JsonData); var options = { method: "POST", host : address, port : port, path : '/upload.node', headers: { 'Content-Type':'application/x-www-form-urlencoded' } }; var req = http.request(options, function(res){ res.setEncoding('utf8'); }); req.write(JsonData); req.end(); } function readFile(filePath){ var fileData = ''; try{ fileData = fs.readFileSync(filePath); }catch(e){ fileData = ''; } return fileData; } app.post('/download.do',function(req,resp){ //可直接参考server.js的代码 }) var server = app.listen(20000,function(){ console.log('Server started.'); })
收藏的用户(0) X
正在加载信息~
推荐阅读
最新回复 (2)
-
-
简单文件下载和API处理,node.js还是很强大,底层库支持的OK~~~
const http = require('http'); const url = require("url"); const fs = require('fs'); const path = require('path'); const querystring = require("querystring"); function fileExist(filepath) { return new Promise(resolve => { fs.access(filepath, (err) => { if(err)resolve(false); else resolve(true); }); }); } async function process (request, response) { //获取返回的url对象的query属性值 const {pathname, query} = url.parse(request.url); //将arg参数字符串反序列化为一个对象 const params = querystring.parse(query); if (pathname.startsWith('/download')) { //下载文件 let filepath = path.resolve(__dirname, './upload/' + params['file']); if(!await fileExist(filepath)) { response.writeHead(404); response.end('<!DOCTYPE html><html><head><meta charset="utf-8"><title>404</title></head></html>'); return; } fs.readFile(filepath,(err,data) => { if (err) { response.end(err); return; } response.writeHead(200, { 'Content-Disposition': 'attachment; filename=' + params['file'], 'Content-type': 'application/octet-stream', 'Content-Length': data.length, 'Access-Control-Allow-Origin': '*', 'Access-Control-Allow-Headers': 'X-Requested-With', 'Access-Control-Allow-Methods': 'PUT,POST,GET,DELETE,OPTIONS', }); fs.createReadStream(filepath).pipe(response); }) } else if (pathname.startsWith('/api')) { // 发送 HTTP 头部 // HTTP 状态值: 200 : OK // 内容类型: text/plain let body = JSON.stringify({ code:'200', msg:'success', param:JSON.stringify(params), path:pathname }); response.writeHead(200, { 'Content-Type': 'application/json', 'Content-Length': body.length, }); response.end(body); } else { let filepath = path.resolve(__dirname, './index.html'); if(!await fileExist(filepath)) { response.writeHead(404); response.end('<!DOCTYPE html><html><head><meta charset="utf-8"><title>404</title></head></html>'); return; } fs.readFile(filepath,(err,data) => { if (err) { response.end(err); return; } response.writeHead(200, { 'Content-type': 'text/html; charset=utf-8', 'Content-Length': data.length }); response.end(data); }) } } http.createServer((request, response) => {try{process(request, response);}catch(error){console.log(error);}}).listen(8080); //http://www.xxx.com:8080/upload?file=notepad.txt
站点信息
- 文章2300
- 用户1336
- 访客10859399
每日一句
True success inspires others to act.
真正的成功是激励他人行动。
真正的成功是激励他人行动。
语法错误: 意外的令牌“标识符”
全面理解Gradle - 定义Task
Motrix全能下载工具 (支持 BT / 磁力链 / 百度网盘)
谷歌Pixel正在开始起飞?
获取ElementUI Table排序后的数据
Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call. This is
亲测!虚拟机VirtualBox安装MAC OS 10.12图文教程
华为手机app闪退重启界面清空log日志问题
android ndk开发之asm/page.h: not found
手机屏幕碎了怎么备份操作?
免ROOT实现模拟点击任意位置
新手必看修改DSDT教程
thinkpad t470p装黑苹果系统10.13.2
新会员