[建站测试] 校园网内简易p2p文件分享平台的手动实现
作者:精品下载站 日期:2021-10-12 04:41:02 浏览:34 分类:站长帮
背景
开学一个多月了,由于繁重的学业和懒惰,都没怎么更新有意思的博客。
前几天突然想到了一个想法。同学之间平常用网络分享一个文件,大部分都是用的qq。但是qq看起来把文件拖到聊天框点击发送就发给对面同学了。但是实际上是先上传到了腾讯的服务器,然后对面的同学再从服务器上下载。
这一上传一下载就很耽误时间。我就想在我的电脑上开一个文件上传服务,别的同学直接上传到我的机械革命上,上传完毕,我就得到了这个文件,不用再下载一遍。而且由于是校园网内的服务,速度也有保障。
语言选择
由于前几天做了几道python flask模板注入的题目,便打算拿flask来当后端练练手,提供http服务。
前端的话还是利用漂亮且方便易用的fomantic-ui解决html和css样式问题,再配合上大大简化js编程的Jquery
来写效果和功能。
遇到的困难
单纯的文件上传十分简单。对付小文件还好,但是大文件就会出现页面停滞的情况,而用户收不到任何反馈,不知道到底是在上传还是崩溃了。我们需要设置一个上传进度条来给以用户友善的提示。所以这里就有一个问题,如何获得上传的进度?
查询资料过后,我发现XMLHttpRequest能够获取进度。然后我又发现Jquery
中封装的$.ajax
能够更加简单的实现。参考链接 https://stackoverflow.com/questions/13203231/is-there-any-way-to-get-jquery-ajax-upload-progress
代码
<!DOCTYPE html>
<html>
<head>
<meta charset="utf8" />
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/jquery.min.js"></script>
<link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/npm/[email protected]/dist/semantic.min.css" />
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/semantic.min.js"></script>
<title>wuuconix's page</title>
</head>
<body>
<div style="padding-top: 5em;"></div>
<div class="ui text container">
<div class="ui placeholder segment">
{% if filelist == [] %}
<div class="ui icon header">
<i class="pdf file outline icon"></i>
目前文件夹里空空如也
</div>
{% else %}
<div class="ui list">
{% for file in filelist%}
<div class="item">
<i class="file icon"></i>
<div class="content">
<a class="header" href="download/{{file}}" data-content="点击下载{{file}}" id="files">{{file}}</a>
</div>
</div>
{% endfor %}
</div>
{% endif %}
<div class="ui buttons">
<button class="ui primary button" id="button_choose">选择文件</button>
<button class="ui positive button" id="button_submit">上传</button>
</div>
<form action="/upload" method="post" enctype="multipart/form-data" id="form">
<input type="file" id="input_file" style="display: none;" name="file">
</form>
<div class="ui divider"></div>
<div class="ui indicating progress" id="progress" data-value="0" data-total="100">
<div class="bar">
<div class="progress"></div>
</div>
<div class="label"></div>
</div>
</div>
</div>
</body>
<script>
$(document).ready(function(){
$("#progress").hide();
$("#button_submit").attr("disabled", true);
});
$("#button_choose").click(function()
{
$("#input_file").click();
});
$("#input_file").bind("input propertychange",function(){
var name = ($(this).prop('files')[0]['name']);
$("#button_submit").attr("disabled", false);
$('#button_choose')[0].innerHTML=name;
});
$("#button_submit").click(function()
{
$("#progress").show();
var formdata = new FormData($("#form")[0]);
$.ajax({
url:'/upload',
type:'post',
xhr: function () {
var xhr = $.ajaxSettings.xhr();
var starttime = Math.ceil(new Date().getTime() / 1000);
xhr.upload.onprogress = function (e) {
if (e.lengthComputable) {
var uploaded = Math.ceil(e.loaded / Math.pow(1024,2));
var spenttime = Math.ceil(new Date().getTime() / 1000) - starttime;
var speed = (uploaded / spenttime).toFixed(2);
var progress = Math.ceil(e.loaded / e.total * 100);
$("#progress").attr('data-value', progress);
$("#progress").progress('update progress', progress);
$("#progress").progress('set label', speed + "MB/s");
}
};
return xhr;
},
processData:false,
contentType:false,
data:formdata,
success:function (data) {
$('body').toast({
title: '恭喜你',
message: "你已经成功将 《" + $('#button_choose')[0].innerHTML + "》 上传至了武丑兄的机械革命。页面即将自动刷新",
showProgress: 'bottom',
classProgress: 'red'
});
setTimeout("location.reload();", 3000)
}
})
});
$('#progress').progress({
label: 'percent',
});
$('a').popup({
on: 'hover'
from flask import render_template, Flask, request, make_response, send_from_directory
import os
def get_filelist():
filelist = os.listdir("upload/")
return filelist
app = Flask(__name__)
@app.route('/')
def hello(filelist=[]):
return render_template("index.html", filelist=get_filelist())
@app.route('/upload',methods=['GET','POST'])
def upload():
if request.method == 'POST':
f = request.files['file']
print(request.files)
f.save(f"upload/{f.filename}")
filelist = get_filelist()
return render_template("index.html", filelist=filelist)
else:
return render_template("index.html", filelist=get_filelist())
@app.route('/download/<filename>',methods=['GET'])
def download(filename):
response = make_response(send_from_directory("upload", filename, as_attachment=True))
response.headers["Content-Disposition"] = "attachment; filename={}".format(filename.encode().decode('latin-1'))
return response
if __name__ == '__main__':
app.run(host='0.0.0.0', port=80)
效果
猜你还喜欢
- 03-12 [建站系列] 如何轻松搭建专业企业邮箱:从域名到收发邮件的完整指南
- 03-12 [建站系列] Cloudflare R2个人免费图床:如何设置和使用Cloudflare R2图床
- 06-04 [站长技术] 如何开启WordPress Multisite多站点网络
- 03-29 [环境测试] Hexo部署GitHub Pages
- 03-22 [源码设置] 如何设置Xiuno BBS URL-Rewrite(伪静态设定)
- 03-06 [建站交流] PicGo + smms 构建图床
- 11-18 [emlog技巧] Emlog非插件显示评论者IP属地
- 11-09 [网站维护] WordPress 后台速度慢?加快仪表板速度的 15 种方法
- 11-09 [WordPress插件] 10 个最好用的 WordPress 聊天机器人插件(免费和付费)
- 11-09 [WordPress开发] 探索 WordPress 6.3 中的增强样板(Patterns)
- 11-09 [网站维护] 无需插件即可优化 WordPress 速度的 12 种策略
- 11-09 [网站安全] WordPress 安全统计:WordPress 到底有多安全?
取消回复欢迎 你 发表评论:
- 精品推荐!
-
- 最新文章
- 热门文章
- 热评文章
[短剧] 2025年06月03日 精选+付费短剧推荐25部
[软件合集] 25年6月3日 精选软件44个
[短剧合集] 2025年06月2日 精选+付费短剧推荐39部
[软件合集] 25年6月2日 精选软件18个
[软件合集] 25年6月1日 精选软件15个
[短剧合集] 2025年06月1日 精选+付费短剧推荐59部
[短剧] 2025年05月31日 精选+付费短剧推荐58部
[软件合集] 25年5月31日 精选软件66个
[电影] 黄沙漫天(2025) 4K.EDRMAX.杜比全景声 / 4K杜比视界/杜比全景声
[风口福利] 短视频红利新风口!炬焰创作者平台重磅激励来袭
[剧集] [央视][笑傲江湖][2001][DVD-RMVB][高清][40集全]李亚鹏、许晴、苗乙乙
[电视剧] 欢乐颂.5部全 (2016-2024)
[电视剧] [突围] [45集全] [WEB-MP4/每集1.5GB] [国语/内嵌中文字幕] [4K-2160P] [无水印]
[影视] 【稀有资源】香港老片 艺坛照妖镜之96应召名册 (1996)
[剧集] 神经风云(2023)(完结).4K
[剧集] [BT] [TVB] [黑夜彩虹(2003)] [全21集] [粤语中字] [TV-RMVB]
[资源] B站充电视频合集,包含多位重量级up主,全是大佬真金白银买来的~【99GB】
[影视] 内地绝版高清录像带 [mpg]
[书籍] 古今奇书禁书三教九流资料大合集 猎奇必备珍藏资源PDF版 1.14G
[美图] 2W美女个美女小姐姐,饱眼福
[电视剧] [突围] [45集全] [WEB-MP4/每集1.5GB] [国语/内嵌中文字幕] [4K-2160P] [无水印]
[剧集] [央视][笑傲江湖][2001][DVD-RMVB][高清][40集全]李亚鹏、许晴、苗乙乙
[电影] 美国队长4 4K原盘REMUX 杜比视界 内封简繁英双语字幕 49G
[电影] 死神来了(1-6)大合集!
[软件合集] 25年05月13日 精选软件16个
[精品软件] 25年05月15日 精选软件18个
[绝版资源] 南与北 第1-2季 合集 North and South (1985) /美国/豆瓣: 8.8[1080P][中文字幕]
[软件] 25年05月14日 精选软件57个
[短剧] 2025年05月14日 精选+付费短剧推荐39部
[短剧] 2025年05月15日 精选+付费短剧推荐36部
- 最新评论
-
- 热门tag