当前位置:   article > 正文

构建个人文件上传服务:Python Flask实现上传和下载完整指南_python搭建文件服务器 上传下载

python搭建文件服务器 上传下载

介绍

在本教程中,我们将学习如何使用Python Flask框架将文件上传到服务器,并使用SQLite数据库来跟踪上传的文件。我们将提供后端代码和一个示例项目的Git链接,以便您可以轻松地跟随本教程。

准备工作

首先,您需要安装Python和Flask框架。您可以按照Flask官方文档上的说明进行安装

pip install flask

项目结构

我们的项目包含以下文件:

  • app.py:包含Flask应用程序的后端代码
  • file_mapping.db:SQLite数据库文件,用于跟踪上传的文件
  • uploads文件夹:用于存储上传的文件

代码解释

  1. import os
  2. import uuid
  3. import sqlite3
  4. from flask import Flask, request, send_from_directory, render_template
  5. app = Flask(__name__)
  6. UPLOAD_FOLDER = 'uploads'
  7. app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER
  8. app.config['MAX_CONTENT_LENGTH'] = 100 * 1024 * 1024 # 设置最大文件上传大小为 100MB
  9. # 创建保存文件的目录
  10. if not os.path.exists(UPLOAD_FOLDER):
  11. os.makedirs(UPLOAD_FOLDER)
  12. # 初始化数据库
  13. conn = sqlite3.connect('file_mapping.db')
  14. c = conn.cursor()
  15. c.execute('''CREATE TABLE IF NOT EXISTS files
  16. (id INTEGER PRIMARY KEY, original_filename TEXT, new_filename TEXT)''')
  17. conn.commit()
  18. conn.close()
  19. @app.route('/')
  20. def index():
  21. return render_template("Upload.html")
  22. @app.route('/upload', methods=['POST'])
  23. def upload_file():
  24. if request.method == 'POST':
  25. if 'folder' not in request.files:
  26. return 'No folder part'
  27. folder = request.files.getlist('folder')
  28. try:
  29. conn = sqlite3.connect('file_mapping.db')
  30. # noinspection PyShadowingNames
  31. c = conn.cursor()
  32. for file in folder:
  33. if file.filename == '':
  34. return '没有选择文件'
  35. if file:
  36. original_filename = file.filename
  37. # 查询数据库,检查文件名是否已经存在
  38. c.execute("SELECT id FROM files WHERE original_filename=?", (original_filename,))
  39. existing_file = c.fetchone()
  40. if existing_file:
  41. continue
  42. else:
  43. # 生成唯一的文件名
  44. new_filename = str(uuid.uuid4()) + os.path.splitext(original_filename)[1]
  45. file_path = os.path.join(app.config['UPLOAD_FOLDER'], new_filename)
  46. file.save(file_path)
  47. # 存储原始文件名和新文件名的关联关系到数据库
  48. c.execute("INSERT INTO files (original_filename, new_filename) VALUES (?, ?)",
  49. (original_filename, new_filename))
  50. conn.commit()
  51. return '文件上传完成'
  52. except Exception as e:
  53. return '文件上载过程中出错: {}'.format(str(e))
  54. finally:
  55. conn.close()
  56. else:
  57. return '请求方法不允许'
  58. @app.route('/list_files', methods=['GET'])
  59. def list_files():
  60. conn = sqlite3.connect('file_mapping.db')
  61. c = conn.cursor()
  62. c.execute("SELECT original_filename, new_filename FROM files")
  63. files = c.fetchall()
  64. conn.close()
  65. return render_template('Review.html', files=files)
  66. @app.route('/download/<filename>')
  67. def download_file(filename):
  68. return send_from_directory(app.config['UPLOAD_FOLDER'], filename, as_attachment=True)
  69. if __name__ == '__main__':
  70. app.run(host='0.0.0.0', port=5001, debug=True)

上传文件

我们使用upload_file函数来处理文件上传。在这个函数中,我们首先检查请求中是否存在文件,然后逐个处理上传的文件。对于每个文件,我们检查数据库中是否已经存在相同的文件名,如果不存在,则生成一个新的唯一文件名,并将文件保存到服务器的uploads文件夹中。

查看和下载文件

我们可以使用list_files函数来查看已上传的文件列表,并使用download_file函数来下载特定文件。

截图

获取示例项目

您可以从以下Git链接中获取完整的示例项目:file-upload.git

结论

通过本教程,您将学会如何使用Python Flask框架将文件上传到服务器,并使用SQLite数据库来管理上传的文件。希望本教程对您有所帮助!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/爱喝兽奶帝天荒/article/detail/890160
推荐阅读
相关标签
  

闽ICP备14008679号