当前位置: 首页 > news >正文

node学习系列之简单文件上传

此为看完node入门写的小demo,自己实现了一遍,借助的外部模块只有formidable
Node.js的Formidable模块的使用

index.js

const server = require('./server');
const router = require('./router.js');
const requestHandler = require('./requestHandler.js');

var handle = {};
handle['/'] = requestHandler.start;
handle['/start'] = requestHandler.start;
handle['/upload'] = requestHandler.upload;
handle['/show'] = requestHandler.show;

server.start(router.route, handle);

server.js

const http = require('http');
const url = require('url');

const start = (route, handle) => {
    http.createServer((request, response) => {
        let pathname = url.parse(request.url).pathname;
        let postData = '';
        console.log('request from' + pathname + 'received');

        route(handle, pathname, response, request);

    }).listen(8888);
}

console.log('server has started');

module.exports = {
    start: start
}

router.js

const route = (handle, pathname, response, request) => {
    console.log('about to route a request for' + pathname);
    if(typeof handle[pathname] === 'function') {
        handle[pathname](response, request);
    }else {
        console.log('no request handle found for ' + pathname);
        response.writeHead(404, {'Conten-Type': 'text/plain'});
        response.write('404 not found');
        response.end();
    }
}

module.exports = {
    route: route
}

requestHandler.js

const querystring = require('querystring');
const fs = require('fs');
const formidable = require('formidable');

const start = (response, request) => {
    console.log('request handle "start" was called');
    let body = `<html lang="en">
                <head>
                    <meta charset="UTF-8">
                    <title>Document</title>
                </head>
                <body>
                    <form action="/upload" method="post" enctype="multipart/form-data">
                        <input type="file" name="upload">
                        <input type="submit" value="submit">
                    </form>
                </body>
                </html>`;
    response.writeHead(200, {'Conten-Type' : 'text/html'});
    response.write(body);
    response.end();
    
}

const upload = (response, request) => {
    console.log('request handle "upload" was called');
    let form = new formidable.IncomingForm();
    form.uploadDir = './upload/tmp';
    form.parse(request, (err, fields, files) => {
        console.log('parse done');
        let body = `<html lang="en">
                    <head>
                        <meta charset="UTF-8">
                        <title>Document</title>
                    </head>
                    <body>
                    <img src="/show" />
                    </body>
                    </html>`;
        fs.renameSync(files.upload.path, '/tmp/test.png')
        response.writeHead(200, {'Content6-Type' : 'text/html'});
        response.write(body);
        response.end();
        
    })
}

const show = (response) => {
    console.log('request handle "show" was called');
    fs.readFile('/tmp/test.png', "binary", (err, file) => {
        if(err) {
            response.writeHead(500, {'Conten-Type' : 'text/plain'});
            response.write(err);
            response.end();
        }else {
            response.writeHead(200, {'Conten-Type' : 'image/png'});
            response.write(file, "binary");
            response.end();
        }
    })
}

module.exports = {
    start: start,
    upload: upload,
    show: show
}

原代码仓库

learn-node/upload

相关文章:

  • 前端 关于汇率的计算
  • mongoDB 文档查询
  • 安装了python报错 或者执行 npm install 时报node-sass的各种相关错误 解决办法
  • 今天打开一个网站 FSO对象实例创建失败
  • 【LeetCode】5. Longest Palindromic Substring 最大回文子串
  • vu2响应式原理 代码分析
  • 希尔排序
  • vu3响应式原理 代码分析
  • Java Tomcat SSL 服务端/客户端双向认证(一)
  • vue3中 setup注意点
  • redis简介
  • 《Spark GraphX in Action》书评及作者访谈
  • vue3的 computed 计算属性 与 watch监听
  • Diomidis Spinellis:有效的调试
  • ListView的简单使用
  • $translatePartialLoader加载失败及解决方式
  • @jsonView过滤属性
  • 【跃迁之路】【477天】刻意练习系列236(2018.05.28)
  • HomeBrew常规使用教程
  • Invalidate和postInvalidate的区别
  • JavaScript/HTML5图表开发工具JavaScript Charts v3.19.6发布【附下载】
  • JavaScript标准库系列——Math对象和Date对象(二)
  • jdbc就是这么简单
  • Linux后台研发超实用命令总结
  • spring cloud gateway 源码解析(4)跨域问题处理
  • Spring技术内幕笔记(2):Spring MVC 与 Web
  • SQLServer之创建数据库快照
  • Storybook 5.0正式发布:有史以来变化最大的版本\n
  • 爱情 北京女病人
  • 笨办法学C 练习34:动态数组
  • 回流、重绘及其优化
  • 聊聊spring cloud的LoadBalancerAutoConfiguration
  • 猫头鹰的深夜翻译:JDK9 NotNullOrElse方法
  • 人脸识别最新开发经验demo
  • 如何使用 JavaScript 解析 URL
  • 手写双向链表LinkedList的几个常用功能
  • 算法系列——算法入门之递归分而治之思想的实现
  • 微信小程序--------语音识别(前端自己也能玩)
  • 一天一个设计模式之JS实现——适配器模式
  • 哈罗单车融资几十亿元,蚂蚁金服与春华资本加持 ...
  • ​【已解决】npm install​卡主不动的情况
  • #13 yum、编译安装与sed命令的使用
  • (4)事件处理——(6)给.ready()回调函数传递一个参数(Passing an argument to the .ready() callback)...
  • (42)STM32——LCD显示屏实验笔记
  • (BFS)hdoj2377-Bus Pass
  • (分类)KNN算法- 参数调优
  • (附源码)ssm航空客运订票系统 毕业设计 141612
  • (全注解开发)学习Spring-MVC的第三天
  • (实战)静默dbca安装创建数据库 --参数说明+举例
  • **CI中自动类加载的用法总结
  • *_zh_CN.properties 国际化资源文件 struts 防乱码等
  • .Net IOC框架入门之一 Unity
  • .net6解除文件上传限制。Multipart body length limit 16384 exceeded
  • .Net下的签名与混淆
  • .NET性能优化(文摘)