简易跨平台上传文件,前后端demo
前端文件
<!DOCTYPE html>
<html>
<head>
<title>文件上传</title>
</head>
<body>
<h1>文件上传1-相对慢,需要等待本地选择的文件全部上传完成后,服务器再保存</h1>
<form id="uploadFormBatch" enctype="multipart/form-data">
<input type="file" id="fileInputBatch" name="file" multiple>
<br><br>
<input type="button" id="btnBatch" value="批量提交整体上传" onclick="clearLog(); uploadFilesBatch()">
</form>
<h1>文件上传2-相对快-推荐使用,本地上传一个,服务器保存一个,前端循环</h1>
<form id="uploadFormOne" enctype="multipart/form-data">
<input type="file" id="fileInputOne" name="file" multiple>
<br><br>
<input type="button" id="btnOne" value="批量提交循环上传" onclick="clearLog(); uploadFilesOne()">
</form>
<div id="log"></div>
<script>
const url = 'http://localhost:8421'
function clearLog() {
const logDiv = document.getElementById('log');
logDiv.innerHTML = ""; // 清空日志内容
}
// 获取当前时间
function getDate() {
var now = new Date();
console.log("当前时间是:" + now);
return now;
}
// 获取两个时间的差值
function diffDate(startTime, endTime) {
// 获取两个时间的时间戳
var startTimeStamp = startTime.getTime();
var endTimeStamp = endTime.getTime();
// 计算时间差(毫秒)
var differenceInMilliseconds = endTimeStamp - startTimeStamp;
// 将毫秒转换为秒
var differenceInSeconds = differenceInMilliseconds / 1000;
console.log("两个时间的差是:" + differenceInSeconds + "秒");
return differenceInSeconds;
}
// 时间格式化 yyyy-MM-dd HH:mm:ss
function formatDate(date) {
const pad = (num) => (num < 10 ? '0' + num : num);
var year = date.getFullYear();
var month = pad(date.getMonth() + 1);
var day = pad(date.getDate());
var hour = pad(date.getHours());
var minute = pad(date.getMinutes());
var second = pad(date.getSeconds());
return `${year}-${month}-${day} ${hour}:${minute}:${second}`;
}
function uploadFilesBatch() {
const files = document.getElementById('fileInputBatch').files;
const butBatch = document.getElementById('btnBatch');
butBatch.disabled = true;// 禁用按钮
const startDate = getDate();
appendLog('程序启动-准备开始上传:' + formatDate(startDate));
const formData = new FormData();
for (let i = 0; i < files.length; i++) {
formData.append('files', files[i]);
}
fetch(url + '/upload_batch', {
method: 'POST',
body: formData
}).then(response => {
return response.text();
}).then(data => {
if (data === '文件上传成功!') {
// console.log(`文件 ${files.length} 上传成功`);
butBatch.disabled = false; //解除禁用
const endDate = getDate();
appendLog(`文件 ${files.length} 上传成功:` + formatDate(endDate));
appendLog(`总共耗时:` + diffDate(startDate, endDate) + `秒`);
} else {
console.error(`文件 ${files.length} 上传失败`);
appendLog(`文件 ${files.length} 上传失败`);
}
}).catch(error => {
console.error(`文件 ${files.length} 上传失败: ${error}`);
appendLog(`文件 ${files.length} 上传失败: ${error}`);
});
}
function uploadFilesOne() {
const files = document.getElementById('fileInputOne').files;
const btnOne = document.getElementById('btnOne');
btnOne.disabled = true; // 禁用按钮
let index = 0;
const startDate = getDate();
appendLog('程序启动-准备开始上传:' + formatDate(startDate));
function uploadFile(index) {
const startDateOne = getDate();
if (index >= files.length) {
const endDate = getDate();
appendLog("所有文件处理完成:" + formatDate(endDate));
appendLog(`总共耗时:` + diffDate(startDate, endDate) + `秒`);
btnOne.disabled = false;// 全部上传完成,解除禁用
return;
}
const file = files[index];
const formData = new FormData();
formData.append('file', file);
appendLog(`文件 ${file.name} 正在上传··· ···`)
fetch(url + '/upload_one', {
method: 'POST',
body: formData
}).then(response => {
return response.text();
}).then(data => {
if (data === '文件上传成功!') {
const endDateOne = getDate();
appendLog(`文件 ${file.name} 上传成功,耗时:` + diffDate(startDateOne, endDateOne) + `秒`);
uploadFile(index + 1); // 递归调用上传下一个文件
} else {
appendLog(`文件 ${file.name} 上传失败:${data}`);
uploadFile(index); // 文件上传失败则继续上传
}
}).catch(error => {
console.error(`文件 ${file.name} 上传失败: ${error}`);
appendLog(`文件 ${file.name} 上传失败: ${error}`);
});
}
uploadFile(index);
}
function appendLog(message) {
const logDiv = document.getElementById('log');
// logDiv.innerHTML += message + "<br>";
logDiv.innerHTML = `<p>${message}</p>` + logDiv.innerHTML;
}
</script>
</body>
</html>
后端文件使用python
# -*- ecoding: utf-8 -*-
# @ModuleName: test002
# 当你要使用这份文件时,
# 代表你已经完全理解文件内容的含义,
# 并愿意为使用此文件产生的一切后果,付全部责任
# @Funcation:
# @Author: darling
# @Time: 2024-06-17 14:21
from flask_cors import CORS
from flask import Flask, request
import os
from loguru import logger
app = Flask(__name__)
CORS(app)
@app.route('/upload_one', methods=['POST'])
def upload_one():
'''
前端上传,批量选择后,前端循环上传,后端单个接收
:return:
'''
file = request.files['file'] # 获取上传的文件
if file:
logger.info('获取到文件{}', file.filename)
file.save(os.path.join('files', file.filename)) # 保存文件到当前目录
logger.info('保存结束{}', file.filename)
return '文件上传成功!'
else:
return '文件上传失败!'
@app.route('/upload_batch', methods=['POST'])
def upload_batch():
'''
前端上传,批量选择后一次性上传,后端循环保存
:return:
'''
files = request.files.getlist('files') # 获取上传的文件列表
if files:
for file in files:
logger.info('获取到文件{}', file.filename)
file.save(os.path.join('files', file.filename)) # 保存文件到当前目录
logger.info('保存结束{}', file.filename)
return '文件上传成功!'
else:
return '文件上传失败!'
if __name__ == '__main__':
app.run(host='0.0.0.0', port=8421)
惜秦皇汉武,略输文采;唐宗宋祖,稍逊风骚。
一代天骄,成吉思汗,只识弯弓射大雕。
俱往矣,数风流人物,还看今朝