Open 17673640425 opened 10 months ago
要使用 Element UI 的 el-upload
组件上传一个 ZIP 文件并将其中的内容一个一个发送到后端,你需要使用 before-upload
事件来获取上传的 ZIP 文件并使用 JSZip 来解压文件,然后将解压后的内容发送到后端。以下是一个示例,演示如何实现这一功能:
<template>
<div>
<el-upload
ref="upload"
action="your-upload-api-endpoint"
:before-upload="handleBeforeUpload"
>
<el-button size="small" type="primary" @click="uploadFiles">点击上传</el-button>
</el-upload>
</div>
</template>
<script>
import JSZip from 'jszip';
export default {
data() {
return {
zipData: null,
filesToUpload: [],
};
},
methods: {
handleBeforeUpload(file) {
// 确保上传的文件类型是ZIP
if (file.type !== 'application/zip') {
this.$message.error('请选择ZIP文件');
return false;
}
const reader = new FileReader();
reader.onload = () => {
this.zipData = reader.result;
};
reader.readAsArrayBuffer(file);
},
async processZIP() {
if (this.zipData) {
const jszip = new JSZip();
const zip = await jszip.loadAsync(this.zipData);
zip.forEach(async (relativePath, file) => {
const content = await file.async('blob');
const formData = new FormData();
formData.append('file', content, file.name);
this.filesToUpload.push(formData);
});
}
},
async uploadFiles() {
await this.processZIP();
if (this.filesToUpload.length > 0) {
// 逐个发送解压后的文件到后端
for (const formData of this.filesToUpload) {
fetch('your-backend-endpoint', {
method: 'POST',
body: formData,
})
.then((response) => {
if (response.ok) {
console.log('成功发送文件');
} else {
console.error('发送文件时出错');
}
})
.catch((error) => {
console.error('发送文件时出错', error);
});
}
}
},
},
};
</script>
在上面的示例中,我们使用 el-upload
组件来上传 ZIP 文件,使用 before-upload
事件来确保上传的文件类型是 ZIP。然后,我们使用 JSZip 来解压 ZIP 文件,并将解压后的文件一个一个地发送到后端。
在 handleBeforeUpload
方法中,我们使用 FileReader
来读取 ZIP 文件。在 processZIP
方法中,我们使用 JSZip 解压 ZIP 文件,并将解压后的文件存储在 this.filesToUpload
数组中,每个文件都以 FormData 的形式存储,以便上传到后端。
最后,在 uploadFiles
方法中,我们逐个发送解压后的文件到后端。
请确保将 'your-upload-api-endpoint'
替换为你的后端API端点,并根据你的需要传递ZIP文件的数据。同样,你需要确保后端能够正确处理这些文件。
要处理上传的ZIP文件,您可以在现有的函数中添加解压缩步骤。然后,按照您原来的方式逐步处理解压后的每个PDF文件,并将处理结果整合成一个数组,最后将该数组发送给前端。以下是一个可能的修改:
import zipfile
import io
@app.post('/qes/')
async def qes(Authorization: str = Header(...), file: UploadFile = File(...)):
mp = {}
if utils.verify_jwt(Authorization, app.secret_key):
file_type = mimetypes.guess_type(file.filename)[0]
sentences = []
if file_type == 'application/zip':
# 解压缩上传的ZIP文件
try:
with zipfile.ZipFile(io.BytesIO(await file.read()), 'r') as zipf:
for zip_info in zipf.infolist():
with zipf.open(zip_info) as pdf_file:
pdf_sentences = await get_content['application/pdf']['func'](pdf_file)
sentences.extend(pdf_sentences)
except Exception as e:
print(e)
mp = R(None, 400, '解压缩ZIP文件出错')
elif file_type in get_content:
try:
sentences = await get_content[file_type]['func'](file)
except Exception as e:
print(e)
mp = R(None, 400, get_content[file_type]['err_msg'])
else:
mp = R(None, 400, 'Oops 请检查文件类型')
try:
res = await analysis(sentences)
mp = R(res, 200, '简历解析成功')
except Exception as e:
print(e)
mp = R(None, 400, '解析出错')
else:
mp = R(None, 402, 'token 验证失败')
return mp
上述代码中,首先检查上传的文件类型是否为ZIP,如果是ZIP文件,它会解压缩文件并处理每个PDF文件。如果文件类型不是ZIP,它将按照原来的方式处理单个文件。然后,将所有处理结果整合到一个数组中并发送给前端。请注意,这里没有处理ZIP文件内部的目录结构,假定ZIP文件中只包含PDF文件。如果ZIP文件包含文件夹结构,您可能需要进一步处理以维护相应的结构。
要将一个 PDF 文件转换为 io.BytesIO
格式,你可以使用 Python 中的 PyPDF2
库来读取 PDF 文件的内容,然后将其写入 io.BytesIO
缓冲区。以下是一个示例:
import PyPDF2
import io
# 打开 PDF 文件
with open('your_pdf_file.pdf', 'rb') as pdf_file:
pdf_reader = PyPDF2.PdfFileReader(pdf_file)
# 选择要提取的页面(例如,第一页)
page = pdf_reader.getPage(0)
# 创建一个 BytesIO 对象
output = io.BytesIO()
# 创建一个新的 PDF 写入器
pdf_writer = PyPDF2.PdfFileWriter()
pdf_writer.addPage(page)
# 将 PDF 页面写入 BytesIO 对象
pdf_writer.write(output)
# 现在,output 包含了 PDF 页面的二进制数据,可以将其用于进一步的处理或输出
这个示例代码会打开一个 PDF 文件,提取第一页的内容,将其写入 io.BytesIO
缓冲区。然后,你可以使用 output.getvalue()
来获取 io.BytesIO
缓冲区中的 PDF 数据。这个数据可以进一步处理或输出,例如,你可以将其发送到前端或保存为文件。
前端上传ZIP文件以Blob格式,然后Python后端接收并解压文件,可以使用以下步骤完成:
前端:
<input type="file">
元素允许用户选择ZIP文件并将其上传。示例前端代码(HTML和JavaScript):
<input type="file" id="zipFileInput">
<button id="uploadButton">Upload</button>
<script>
document.getElementById('uploadButton').addEventListener('click', async () => {
const zipFileInput = document.getElementById('zipFileInput');
const zipFile = zipFileInput.files[0];
if (zipFile) {
const formData = new FormData();
formData.append('zipFile', zipFile);
const response = await fetch('/upload', {
method: 'POST',
body: formData,
});
if (response.ok) {
alert('ZIP file uploaded and processed successfully.');
} else {
alert('Failed to upload ZIP file.');
}
}
});
</script>
后端:
zipfile
库来解压ZIP文件,然后将其内容保存到指定目录。示例后端代码(使用FastAPI框架):
from fastapi import FastAPI, File, UploadFile
from fastapi.responses import JSONResponse
import zipfile
import os
app = FastAPI()
@app.post('/upload')
async def upload_zip_file(zip_file: UploadFile = File(...)):
try:
# 指定保存目录
target_directory = 'your_target_directory/'
os.makedirs(target_directory, exist_ok=True)
# 将上传的ZIP文件保存到指定目录
with open(os.path.join(target_directory, zip_file.filename), 'wb') as f:
f.write(zip_file.file.read())
# 解压ZIP文件到指定目录
with zipfile.ZipFile(os.path.join(target_directory, zip_file.filename), 'r') as zip_ref:
zip_ref.extractall(target_directory)
return JSONResponse(content={"message": "ZIP file uploaded and processed successfully"})
except Exception as e:
return JSONResponse(content={"message": f"Failed to upload and process ZIP file: {str(e)}"}, status_code=400)
这是一个基本示例,您可以根据实际需求进行扩展和改进。请确保替换 'your_target_directory/'
为您想要保存ZIP文件和解压内容的本地目标目录。还要根据您的Web框架和后端库来处理文件上传。前端上传ZIP文件以Blob格式,然后Python后端接收并解压文件,可以使用以下步骤完成:
前端:
<input type="file">
元素允许用户选择ZIP文件并将其上传。示例前端代码(HTML和JavaScript):
<input type="file" id="zipFileInput">
<button id="uploadButton">Upload</button>
<script>
document.getElementById('uploadButton').addEventListener('click', async () => {
const zipFileInput = document.getElementById('zipFileInput');
const zipFile = zipFileInput.files[0];
if (zipFile) {
const formData = new FormData();
formData.append('zipFile', zipFile);
const response = await fetch('/upload', {
method: 'POST',
body: formData,
});
if (response.ok) {
alert('ZIP file uploaded and processed successfully.');
} else {
alert('Failed to upload ZIP file.');
}
}
});
</script>
后端:
zipfile
库来解压ZIP文件,然后将其内容保存到指定目录。示例后端代码(使用FastAPI框架):
from fastapi import FastAPI, File, UploadFile
from fastapi.responses import JSONResponse
import zipfile
import os
app = FastAPI()
@app.post('/upload')
async def upload_zip_file(zip_file: UploadFile = File(...)):
try:
# 指定保存目录
target_directory = 'your_target_directory/'
os.makedirs(target_directory, exist_ok=True)
# 将上传的ZIP文件保存到指定目录
with open(os.path.join(target_directory, zip_file.filename), 'wb') as f:
f.write(zip_file.file.read())
# 解压ZIP文件到指定目录
with zipfile.ZipFile(os.path.join(target_directory, zip_file.filename), 'r') as zip_ref:
zip_ref.extractall(target_directory)
return JSONResponse(content={"message": "ZIP file uploaded and processed successfully"})
except Exception as e:
return JSONResponse(content={"message": f"Failed to upload and process ZIP file: {str(e)}"}, status_code=400)
这是一个基本示例,您可以根据实际需求进行扩展和改进。请确保替换 'your_target_directory/'
为您想要保存ZIP文件和解压内容的本地目标目录。还要根据您的Web框架和后端库来处理文件上传。
要前端上传ZIP文件(包含中文名称和中文内容的文件)以Blob格式,然后在Python后端接收并将其解压到指定路径,您可以使用以下步骤:
前端:
使用HTML <input type="file">
元素允许用户选择ZIP文件并将其上传。确保使用enctype="multipart/form-data"
来设置表单类型为multipart/form-data
,以便支持文件上传。
使用JavaScript将选择的ZIP文件转换为Blob,并通过HTTP POST请求将Blob数据发送到后端。
示例前端代码(HTML和JavaScript):
<form id="uploadForm" enctype="multipart/form-data">
<input type="file" id="zipFileInput" name="zipFile">
<button type="submit">Upload</button>
</form>
<script>
document.getElementById('uploadForm').addEventListener('submit', async (event) => {
event.preventDefault();
const zipFileInput = document.getElementById('zipFileInput');
const zipFile = zipFileInput.files[0];
if (zipFile) {
const formData = new FormData();
formData.append('zipFile', zipFile);
const response = await fetch('/upload', {
method: 'POST',
body: formData,
});
if (response.ok) {
alert('ZIP file uploaded and processed successfully.');
} else {
alert('Failed to upload ZIP file.');
}
}
});
</script>
后端:
在Python后端,使用一个路由(例如,'/upload')来接收前端发送的ZIP文件。
使用Python的zipfile
库来解压ZIP文件,确保使用适当的编码解压中文文件名和中文内容。
示例后端代码(使用FastAPI框架):
from fastapi import FastAPI, File, UploadFile
from fastapi.responses import JSONResponse
import zipfile
import os
import shutil
app = FastAPI()
@app.post('/upload')
async def upload_zip_file(zip_file: UploadFile = File(...)):
try:
# 指定保存目录
target_directory = 'your_target_directory/'
os.makedirs(target_directory, exist_ok=True)
# 将上传的ZIP文件保存到指定目录
with open(os.path.join(target_directory, zip_file.filename), 'wb') as f:
f.write(zip_file.file.read())
# 解压ZIP文件到指定目录
with zipfile.ZipFile(os.path.join(target_directory, zip_file.filename), 'r') as zip_ref:
for file_info in zip_ref.infolist():
file_name = file_info.filename.encode('cp437').decode('utf-8')
with open(os.path.join(target_directory, file_name), 'wb') as dest_file:
shutil.copyfileobj(zip_ref.open(file_info), dest_file)
return JSONResponse(content={"message": "ZIP file uploaded and processed successfully"})
except Exception as e:
return JSONResponse(content={"message": f"Failed to upload and process ZIP file: {str(e)}"}, status_code=400)
这是一个基本示例,涵盖了如何上传包含中文文件名和中文内容的ZIP文件,并在后端解压这些文件。请确保替换 'your_target_directory/'
为您想要保存ZIP文件和解压内容的本地目标目录。注意,在处理ZIP文件时,文件名可能使用不同的编码,因此需要根据需要进行编码转换,以确保正确解压和保存文件。根据您的具体情况,您可能需要调整代码以处理不同的编码和文件名。
要获取一个路径下所有的PDF文件的名称,您可以使用Python的os
模块和列表推导式。以下是一个示例代码:
import os
# 指定要搜索PDF文件的目录
directory = '/your/directory/path' # 替换成实际的目录路径
# 使用列表推导式获取目录下所有PDF文件的名称
pdf_files = [file for file in os.listdir(directory) if file.endswith('.pdf')]
# 打印PDF文件名称
for pdf_file in pdf_files:
print(pdf_file)
在上述代码中,首先指定要搜索PDF文件的目录路径,并使用os.listdir()
来获取该目录下的所有文件和子目录。然后,使用列表推导式筛选出所有以.pdf
为扩展名的文件,并将它们保存在pdf_files
列表中。最后,您可以遍历pdf_files
列表以获取PDF文件的名称。
请确保将'/your/directory/path'
替换为实际的目录路径,以便正确搜索目标目录下的PDF文件。
博主能分享一下训练测试数据集吗,学习使用,谢谢 1043164770@qq.com