NodeJS+formidable实现文件上传加自动重命名
前述
本人node初学者,此前使用原生node实现文件上传时遇到了一些困难,只做到了.txt
和.png
两中格式的文件可以正常上传,如果上传其他格式文件服务端保存的文件会无法正常打开,原因是对form表单传来的数据处理不彻底。后来查找许多资料了解到了formidable
这个第三方模块,可通过以下指令安装:
npm i formidable
官方对它的描述:
A Node.js module for parsing form data, especially file uploads.
一个专门用来处理表单数据尤其是文件上传的Node.js模块。
实现过程
- 首先新建一个html文件作为前端,由于这里只讲功能所有没有添加任何样式。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>上传文件</title>
</head>
<body>
<form action="/upload" method="POST" enctype="multipart/form-data">
<input type="file" name="up_file" id="upload">
<input type="submit" id="submit" name="submit">
</form>
</body>
</html>
这里需要把form的enctype
设置为multipart/form-data
。
MND对此的描述:
multipart/form-data:当表单包含 type=file 的
<input>
元素时使用此值。
- 新建main.js,用node的http模块开启http服务。
const http = require("http");
const fs = require("fs");
const formidable = require("formidable");
let server = http.createServer((req,res)=>{
if(req.url = "/upload"){
switch(req.method){
case "GET":
//使用流来加载upload.html
fs.createReadStream("./upload.html").pipe(res);
break;
case "POST":
dealUpload(req,res);
break;
default:
console.log("other method...");
break;
}
}else{
res.writeHead(302,{"Location": "upload"});
res.end();
}
})
//监听8080端口
server.listen(8080);
console.log("listening on 8080, http://127.0.0.1:8080");
- 使用
formidable
处理表单数据,并对生成的新文件重命名。
function dealUpload(req,res){
var form = formidable.IncomingForm();
//保持原有扩展名
form.keepExtensions = true;
//设置上传目录
form.uploadDir = __dirname + "/files/";
form.parse(req,function(err,fields,files){
if(err) throw err;
console.log(fields);
let oldFilename = files.up_file.name;
//重命名上传的文件
fs.rename(files.up_file.path, form.uploadDir + generateFilename(oldFilename),err=>{
if(err) {
console.log("重命名失败");
console.log(err);
}else{
console.log("重命名成功!");
}
})
res.writeHead(200,{"Content-type":"text/html;charset='utf-8'"});
res.write('<meta charset="UTF-8" />');
res.end("<h1>上传结束</h1>");
})
}
function generateFilename(oldFilename){
//将老的文件名拼上时间戳,这样既不会命名冲突又可以看出文件的上传事件
let d = new Date();
let names = oldFilename.split(".");
return `${names[0]}_${""+d.getFullYear() + (d.getMonth()+1) + d.getDate() +'_'+ d.getHours() + d.getMinutes() + d.getSeconds()}.${names[1]}`;
}
运行效果
使用node main.js
指令将程序运行起来,然后在浏览器输入http://127.0.0.1:8080
可以看到:
选择一个文件后点击提交:
然后即可在之前设置保存目录下看到已保存且重命名的文件:
如有错误欢迎指正
NodeJS+formidable实现文件上传加自动重命名的更多相关文章
- nodejs+express-实现文件上传下载管理的网站
Nodejs+Express-实现文件上传下载管理的网站 项目Github地址(对你有帮助记得给星哟):https://github.com/qcer/updo 后端:基于nodejs的express ...
- nodejs学习之文件上传
最近要做个图片上传的需求,因为服务端春节请假回家还没来,所以就我自己先折腾了一下,大概做出来个效果,后台就用了nodejs,刚开始做的时候想网上找一下资料,发现大部分资料都是用node-formida ...
- nodejs --- formidable模块 , post 上传.
1. 只有一个文件域: var formidable = require('formidable'), http = require('http'), util = require('util'); ...
- javascript结合nodejs实现多文件上传
前端文件上传功能比较依赖后端,所以第一步用nodejs实现一个供文件上传的功能接口. 因为本人对nodejs也是一知半解,所以刚开始的想法是像原始的ajax交互那样,获取上传文件的内容,然后再通过no ...
- NodeJs koa2实现文件上传
[转载自:]https://www.jianshu.com/p/34d0e1a5ac70 知识讲解 koa2框架是一个基于中间件的框架,也就是说,需要使用到的功能,比如路由(koa-router),日 ...
- jquery 实现拖动文件上传加进度条
通过对文件的拖动实现文件的上传,主要用到的是HTML5的ondrop事件,上传内容通道FormData传输: //进度条 <div class="parent-dlg" &g ...
- nodejs+multer+ajax文件上传
前端 html代码 + ajax代码 form表单(无需指定action) <form enctype="multipart/form-data" method=" ...
- NodeJS使用formidable实现文件上传
最近自学了一下NodeJS,然后做了一个小demo,实现歌曲的添加.修改.播放和删除的功能,其中自然要实现音乐和图片的上传功能.于是上网查找资料,找到了一个formidable插件,该插件可以很好的实 ...
- layui 文件上传加进度条
1.页面 <div class="layui-row layui-col-space5"> <div class="layui-form-item&qu ...
随机推荐
- C++ 基础 2:C++ 对 C 语言的拓展
1 引用 1.1 定义及编程实践 引用,是某个已存在变量的另一个名字. 一旦把引用初始化为某个变量,就可以使用该引用名称或变量名称来指向变量. 注意: 引用没有定义,是一种关系型声明.声明它和原有某一 ...
- 【Mycat】Mycat核心开发者带你看尽Mycat三大核心配置文件
写在前面 在分布式数据库中间件领域,Mycat和ShardingSphere可以说是在开源界有着相当重要的位置,不少小伙伴也在问我:Mycat和sharding-jdbc哪个好呀!其实,就我本身而言, ...
- Core WebApi项目快速入门(一):环境部署
1.WebApi新建与部署 1.1 新建Core WebApi工程 1.2 部署 1.2.1 IIS部署 首先以文件方式发布应用程序,然后下载依赖.net core运行时及host安装包 在iis中看 ...
- python_计算器
import re from functools import reduce # 定义一个只计算两个数的乘法或除法的函数: def multiply_division(exp): if "* ...
- 【转】linux自测题
一.填空题: 1. 在Linux系统中,以 文件 方式访问设备. 2. Linux内核引导时,从文件 /etc/fstab 中读取要加载的文件系统. 3. Linux文件系统中每个文件用 i节点 来标 ...
- Zabbix实现电话告警通知的配置方法分享
如果要讨论下当下热门的监控系统,我想zabbix应该能够占有自己的一席之地,拥有不小的话语权吧.然而身为一名苦逼的运维,为了不错过重大的告警信息,就需要配置个[电话告警]来进行最快速的通知. zabb ...
- gdb调试入门(上)
一.什么是gdb:gdb是GNU debugger的缩写,是编程调试工具二.gdb功能:1.启动程序,可根据用户要求随心所欲的运行程序(比如带参数)2.可让被调试的程序在用户指定的调试的断点处停住3. ...
- 剑指offer刷题(Tree)
开篇 二刷剑指offer了,本来用Tyora记的笔记,发现字数到四万了就变得好卡o(╥﹏╥)o,刚好开始写博客,就转过来吧,记下来子自己看.不废话,开刷... JZ26. 树的子结构 输入两棵二叉树A ...
- 使用spring框架进行aop编程实现方法调用前日志输出
aop编程 之使用spring框架实现方法调用前日志输出 使用spring框架实现AOP编程首先需要搭建spring框架环境: 使用Spring框架实现AOP工程编程之后,不需要我们去写代理工厂了,工 ...
- 协程实现爬虫的例子主要优势在于充分利用IO时间去请求其他的url
# 分别使用urlopen和requests两个模块进行演示 # import requests # 需要安装的 # from urllib.request import urlopen # # ur ...