fix(admin): 通过API端点下载简历附件,解决HTML问题

This commit is contained in:
TianyangZhang 2026-03-25 16:35:43 +08:00
parent a6ebd3af87
commit 79706dd840
2 changed files with 46 additions and 11 deletions

View File

@ -1,4 +1,7 @@
from rest_framework import generics, viewsets
from rest_framework.response import Response
from rest_framework.decorators import action
from django.http import FileResponse
from .models import Application
from .serializers import ApplicationCreateSerializer, ApplicationSerializer, ApplicationStatusSerializer
from .emails import notify_status_change
@ -28,6 +31,26 @@ class ApplicationManageViewSet(viewsets.ReadOnlyModelViewSet):
job__organization=user.organization
).select_related('job__organization', 'applicant')
@action(detail=True, methods=['get'])
def download_resume(self, request, pk=None):
"""下载求职者的简历附件"""
application = self.get_object()
attachment_url = application.resume_snapshot.get('attachment_url')
if not attachment_url:
return Response({'detail': '附件不可用'}, status=404)
try:
from django.core.files.storage import default_storage
# 获取文件
file = default_storage.open(attachment_url.lstrip('/media/'), 'rb')
response = FileResponse(file)
response['Content-Type'] = 'application/octet-stream'
response['Content-Disposition'] = f'attachment; filename="{application.resume_snapshot.get("name", "resume")}.pdf"'
return response
except Exception as e:
return Response({'detail': f'下载失败: {str(e)}'}, status=400)
class ApplicationStatusUpdateView(generics.UpdateAPIView):
serializer_class = ApplicationStatusSerializer
permission_classes = [IsAdminOrSuperAdmin]

View File

@ -104,6 +104,7 @@ const applications = ref([])
const loading = ref(false)
const resumeVisible = ref(false)
const currentResume = ref(null)
const currentApplicationId = ref(null)
const genderMap = {
'male': '男',
@ -128,6 +129,7 @@ async function updateStatus(row) {
function viewResume(row) {
currentResume.value = row.resume_snapshot
currentApplicationId.value = row.id
resumeVisible.value = true
}
@ -135,19 +137,29 @@ function getGenderLabel(gender) {
return genderMap[gender] || '-'
}
function downloadAttachment() {
if (!currentResume.value?.attachment_url) {
ElMessage.warning('附件不可用')
async function downloadAttachment() {
if (!currentApplicationId.value) {
ElMessage.warning('无法获取投递记录')
return
}
const link = document.createElement('a')
link.href = currentResume.value.attachment_url
link.download = `${currentResume.value.name}_resume`
link.style.display = 'none'
document.body.appendChild(link)
link.click()
document.body.removeChild(link)
ElMessage.success('下载已启动')
try {
const response = await fetch(`/api/applications/manage/${currentApplicationId.value}/download_resume/`)
if (!response.ok) throw new Error('下载失败')
const blob = await response.blob()
const url = window.URL.createObjectURL(blob)
const link = document.createElement('a')
link.href = url
link.download = `${currentResume.value.name}_resume.pdf`
document.body.appendChild(link)
link.click()
document.body.removeChild(link)
window.URL.revokeObjectURL(url)
ElMessage.success('下载已启动')
} catch (e) {
ElMessage.error('下载失败,请重试')
console.error(e)
}
}
</script>