目录
1. 项目目标
- 实现一个基于 PyQt5 的图形用户界面应用程序,用于上传大文件到阿里云 OSS(对象存储服务)。
- 提供用户友好的操作界面,简化文件上传流程。
- 生成文件的下载链接,方便用户分享或下载已上传的文件。
2. 功能需求
(1)文件选择功能
- 提供一个按钮,允许用户通过文件对话框选择要上传的文件。
- 显示用户选择的文件路径。
(2)文件上传功能
- 提供一个上传按钮,用户点击后,程序将选定的文件上传到指定的OSS bucket。
(3)下载链接生成与显示
- 上传成功后,程序应生成文件的下载链接。
- 在界面上显示可点击的下载链接,用户点击后可以直接访问或下载文件。
(4)界面布局与交互
- 应用程序应具有简洁直观的界面布局。
3. 项目展示
选择要上传的文件
点击上传:
服务器端:
可以看见上传的英语.md
把链接复制到浏览器:
下载成功!现在遇到微信无法发送大文件的难题已经得到解决,无需再依赖微信、QQ或是云盘来分享大型文件。通过OSS服务器进行下载,下载速度将取决于你的网络带宽,通常情况下,从服务器下载文件的速度会非常快。
4. 项目准备工作
(1)环境
1️⃣ 操作系统:Windows 7以上
2️⃣ Python:3.8
3️⃣ IDE:Pycharm或vscode
4️⃣ 依赖:最新版的PyQt
(2)注册阿里云OSS
注册阿里云OSS,创建你的bucket
申请一个AccessKey
5. 代码
from PyQt5 import QtWidgets
from datetime import datetime
import oss2
import sys
class OSSClient:
def __init__(self, accessKeyId, accessKeySecret, endpoint, bucketName):
self.auth = oss2.Auth(accessKeyId, accessKeySecret)
self.endpoint = endpoint
self.bucketName = bucketName
self.bucket = oss2.Bucket(self.auth, self.endpoint, self.bucketName)
def upload_file(self, objectName, localFile):
self.bucket.put_object_from_file(objectName, localFile)
def generate_file_link(self, objectName):
return f'http://{self.bucketName}.{self.endpoint}/{objectName}'
class UploadApp(QtWidgets.QWidget):
def __init__(self):
super().__init__()
self.initUI()
# 初始化 OSS 客户端
self.oss_client = OSSClient(
accessKeyId="你的KeyId",
accessKeySecret="你的秘钥",
endpoint="oss-cn-beijing.aliyuncs.com", #换成你的endpoint
bucketName="你的bucket名字"
)
def initUI(self):
self.setWindowTitle('OSS 文件上传')
self.setGeometry(500, 500, 800, 400)
# 布局
layout = QtWidgets.QVBoxLayout()
# 文件选择按钮
self.select_file_btn = QtWidgets.QPushButton('选择文件', self)
self.select_file_btn.clicked.connect(self.select_file)
layout.addWidget(self.select_file_btn)
# 显示文件路径
self.file_path_label = QtWidgets.QLabel('未选择文件', self)
layout.addWidget(self.file_path_label)
# 上传按钮
self.upload_btn = QtWidgets.QPushButton('上传文件', self)
self.upload_btn.clicked.connect(self.upload_file)
layout.addWidget(self.upload_btn)
# 显示下载链接
self.link_label = QtWidgets.QLabel('', self)
self.link_label.setOpenExternalLinks(True) # 使链接可点击
layout.addWidget(self.link_label)
self.setLayout(layout)
def select_file(self):
# 打开文件选择对话框
options = QtWidgets.QFileDialog.Options()
file_path, _ = QtWidgets.QFileDialog.getOpenFileName(self, "选择文件", "", "All Files (*)", options=options)
if file_path:
self.file_path = file_path
self.file_path_label.setText(f'文件路径: {file_path}')
def upload_file(self):
try:
# 使用当前时间戳生成文件名,确保唯一
object_name = f'{int(datetime.timestamp(datetime.now()))}_{self.file_path.split("/")[-1]}'
self.oss_client.upload_file(object_name, self.file_path)
file_link = self.oss_client.generate_file_link(object_name)
# 在界面显示下载链接
self.link_label.setText(f'<a href="{file_link}">下载链接: {file_link}</a>')
except Exception as e:
self.link_label.setText(f'上传失败: {e}')
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
mainWin = UploadApp()
mainWin.show()
sys.exit(app.exec_())