注:这里使用pyqt5需要安装插件,其实也可以用python自带的tkinter来实现这个功能,但我没试。因为以前学过pyqt,电脑也安装了这个,就尝试用pyqt5来写了。
在写前端选择上传文件的时候尝试了很多方法都无法得到文件的绝对路径,后来看了一下好像是因为浏览器害怕电脑中所有文件都会被盗取,所以避开了在上传文件时给出绝对路径,也就是前端只能获得选择文件的文件名。
为此我尝试了两种方法,第一种是讲得到的文件名进行重新存储在指定文件夹下,这样可以直接进行绝对路径才能进行的操作。这里的文件选择是在前端我使用layui自带的文件加载方法,就会出现选择文件的界面。
layui实现前端链接:https://www.layui.com/doc/modules/upload.html
file_path = request.files.get('file') #获取从前端传来的文件的文件路径
# 先将原来的文件保存下来
file_paths = file_path.filename #获取对应路径的文件名
new_fname=r"D:/学科建设/毕业设计/static/file/"+file_paths
print(new_fname)
file_path.save(new_fname) #将它保存在指定文件夹下
这是一种方法,然后接下来说的就是我使用pyqt来实现的方法了,直接写了一个类函数,然后调用该类就出现了文件的选择界面,但速度有点慢。
前端用html实现
<div class="layui-card" id="card2">
<div class="layui-button">
<button class="layui-btn layui-btn-normal"id="add" οnclick="clickme()">点击上传</button>
</div>
</div>
script标签里面绑定点击事件
<script>
$('#add').click(function(){
alert('点击成功')
$.post('/file_upload',{}, function(ans){
if(ans=='false') {
alert('上传失败,请重新选择文件')
}
else {
alert(ans+'上传成功')
}
})
})
</script>
class实现的文件选择的类:
from PyQt5.QtWidgets import QFileDialog
from win32com import client as wc
import os
class xuanze():
def __init__(self):
get_filename_path, ok = QFileDialog.getOpenFileName(None,
"选取单个文件",
"C:/",
"All Files (*);;Text Files (*.txt)")
if ok:
word = wc.Dispatch("Word.Application")
if get_filename_path.endswith('.doc') and not get_filename_path.startswith('~$'):
print(get_filename_path)
# 打开文件
doc = word.Documents.Open(get_filename_path)
# # 将文件名与后缀分割
rename = os.path.splitext(get_filename_path)
# print(rename)
# os.rename(get_filename_path,rename[0]+'.docx')
# 将文件另存为.docx
doc.SaveAs(rename[0] + '.docx', 12) # 12表示docx格式
doc.Close()
get_filename_path = rename[0] + '.docx'
# self.filePathlineEdit.setText(str(get_filename_path))
# 将其重命名为zip文件
if get_filename_path.endswith('.docx'):
re = os.path.splitext(get_filename_path)
os.rename(get_filename_path, re[0] + '.zip')
print('转换结束')
data=os.path.split(get_filename_path)
self.name=data[1]
else :
self.name='false'
调用该类并返回:
@app.route('/file_upload',methods=['GET', 'POST'])
def unloade_return():
app=QApplication(sys.argv)
value=xuanze()
return value.name
注意在app重定位那一定要加methods方法,否则会报405(也就是不能加载静态页面的错)。
就这样就实现了所有内容。
还有我的xuanze()类主要是实现将doc格式文档另存为docx格式文档,要打开文件并另存为,所以必须要绝对路径才能实现。最后再讲docx格式文档重命名为zip格式文档。
最后:本人水平有限,如果大佬有更好的方法,能指教一二那感激不尽。