
前端
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
a[class="button-selectimg"] {
color: #00A2D4;
padding: 4px 6px;
border: 1px dashed #00A2D4;
border-radius: 2px;
text-decoration: none;
}
input[id="avatval"] {
padding: 3px 6px;
padding-left: 10px;
border: 1px solid #E7EAEC;
width: 230px;
height: 25px;
line-height: 25px;
border-left: 3px solid #3FB7EB;
background: #FAFAFB;
border-radius: 2px;
}
input[type='file'] {
border: 0px;
display: none;
}
img {
width: 100px;
height: 100px;
}
</style>
</head>
<body>
<div class="input-file">
<progress id="Progress" value="0" max="100"></progress>
<input type="file" name="avatar" id="avatar" />
<a href="javascript:void(0);" class="button-selectimg" id="fileChange">选择文件</a>
<img src="" alt="上传图片..." id="portrait">
<button id="handleUpload">确认上传</button>
</div>
</body>
</html>
<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
<script>
let formData;
$("#fileChange").click(function () {
$("input[type='file']").trigger('click');
});
$("input[type='file']").change(function () {
showPreview(this)
});
$('#handleUpload').click(function () {
fileUpload()
})
function showPreview(source) {
const portraitDom = document.getElementById("portrait");
const ProgressDome = document.getElementById("Progress");
let file = source.files[0];
formData = new FormData()
formData.append('file', file)
if (file.type.includes('image')) {
if (window.FileReader) {
let fr = new FileReader();
let total = file.size;
fr.readAsDataURL(file);
fr.onloadend = function (e) {
portraitDom.src = e.target.result;
};
fr.onprogress = function (ev) {
let loading = (ev.loaded / total) * 100;
ProgressDome.value = loading;
}
}
} else {
alert('请上传图片')
}
}
function fileUpload() {
if (formData) {
$.ajax({
url: "http://localhost:3000/single",
type: "POST",
dataType: "JSON",
data: formData,
processData: false,
contentType: false,
success: function (response) {
fileFormReset()
console.log(response, '成功')
},
error: function (error) {
fileFormReset()
console.log(error, '失败')
}
})
} else {
alert('请选择上传图片')
}
}
function fileFormReset() {
formData = null
}
</script>
后端Node
var express = require('express');
var multer = require('multer')
var app = express();
let upload = multer({
storage: multer.diskStorage({
destination: function (req, file, cb) {
cb(null, './uploads/');
},
filename: function (req, file, cb) {
var changedName = (new Date().getTime())+'-'+file.originalname;
cb(null, changedName);
}
})
});
app.post('/single', upload.single('file'), (req, res) => {
res.header("Access-Control-Allow-Origin", "*");
res.json({
code: '0000',
type: 'single',
originalname: req.file.originalname,
path: req.file.path
})
});
app.listen(3000);
项目结构 注意:
