- get,set自定义属性;
-
基本事件触发、响应;服务器、客户端之间的实时通信;
-
这个功能不要太强大。。还需继续挖掘;
-
模板引擎EJS(Embedded JavaScript),较简单,跟Jekyll的Liquid语法有一拼;
-
文件上传模块formidable:
-
文件上传;
-
计算md5;
-
path模块:path.join(); path.extname();
-
原生JavaScript的知识点巩固:
-
DOM操作;
-
Map操作;
-
Date转换;
-
对象封装;
-
正则表达式;
Features
- 最后长这样子:
- 作为应用Express 4.x与socket.io的小例子,实现文件的上传、下载;
关键是如何通过socket.io实现前后端的实时通信:在routes中使用socket触发文件上传进度事件。
-
前端上传进度条:显示上传进度,用div宽度模拟,比较简陋;
-
点击文件名可下载:相对上传,下载简单多了,通过response的download方法实现;
-
文件去重:在上传过程中通过formidable提供的
form.hash='md5'
计算文件唯一标识,保证上传后的文件不重复; -
客户端校验:用户输入后,简单的文件名合法性校验;
Let’s code
- Server Side : app.js
var express = require(‘express’);
var path = require(‘path’);
var app = express();
var port = 8888;
// view engine setup
app.set(‘views’, path.join(__dirname, ‘views’));
app.set(‘view engine’, ‘ejs’);
// include static files
app.use(express.static(path.join(__dirname, ‘public’)));
// upload destination setup
app.set(‘files’, path.join(__dirname, ‘/public/files’));
var index = require(‘./routes/index’);
// router
app.get(‘/upload’, index.list);
app.post(‘/upload’, index.submit(app.get(‘files’)));
app.get(‘/file/:id/download’, index.download(app.get(‘files’)));
var server = app.listen(port);
console.log("Listening on port: " + port);
var io = require(‘socket.io’)(server);
app.set(‘socketio’, io); // store a reference to the io object, can be passed to routes
- Router - Form and File List: index.js
var formidable = require(‘formidable’);
var fs = require(‘fs’);
var path = require(‘path’);
var fileUploaded = new Map(); // store uploaded files
exports.list = function (req, res) {
res.render(‘index’, {
title: “File upload”,
fileUploaded: fileUploaded
});
};
- Router - Submit and Upload: index.js
exports.submit = function (dir) {
return function (req, res, next) {
var form = new formidable.IncomingForm();
// high level formidable API
form.uploadDir = dir; // set destination
form.hash = ‘md5’; // use hash algorithm, we can get hash value by ‘file.hash’
form.parse(req, function (err, fields, files) {
// console.log(fields);
// console.log(files);
files.file.lastModifiedDate = files.file.lastModifiedDate.toLocaleString();
var f = {
newName: fields.name.length == 0
-
? files.file.name
- fields.name + path.extname(files.file.name),
file: files.file
};
if (fileUploaded.has(files.file.hash)) {
form.emit(‘aborted’); // doesn’t work!?
console.log(‘aborted’);
} else {
fileUploaded.set(files.file.hash, f); // add to map
}
fs.rename(files.file.path, path.join(form.uploadDir, files.file.name), function (err) {
if (err) {
console.log(err);
}
res.redirect(‘/upload’);
console.log(‘Finished.’);
});
});
var io = req.app.get(‘socketio’); // get reference to socket.io
// listening progress event and send data to client
form.on(‘progress’, function (bytesReceived, bytesExpected) {
var percent = Math.floor(bytesReceived / bytesExpected * 100);
console.log(percent);
var progress = {
name: ‘progress’,
percent: percent
};
// emit event : progress
io.emit(‘progress’, progress); //notify all client, no session here
});
}
};
- Router - Download :index.js
exports.download = function (dir) {
return function (req, res, next) {
var id = req.params.id;
var file = fileUploaded.get(id);
var targetPath = path.join(dir, file.file.name);
// second parameter can be used to specify file name
res.download(targetPath, file.newName);
};
};
- Layout(only part of the file): index.ejs
<% fileUploaded.forEach(function(item, key, mapObj) { %>
<%=item.newName%> <%=item.file.size%> <%=item.file.type%> <%=item.file.lastModifiedDate%> **自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。**深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)
最后
各位读者,由于本篇幅度过长,为了避免影响阅读体验,下面我就大概概括了整理了
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
72faed303032d36.jpg" alt=“img” style=“zoom: 33%;” />
最后
各位读者,由于本篇幅度过长,为了避免影响阅读体验,下面我就大概概括了整理了
[外链图片转存中…(img-QEWQjboo-1713466948702)]
[外链图片转存中…(img-ROA35xSt-1713466948703)]
[外链图片转存中…(img-I1S8sZZT-1713466948705)]
[外链图片转存中…(img-hxtymuFd-1713466948707)]
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!