Как я могу загрузить все файлы, относящиеся к определенному запросу, сразу в zip-файл?
У меня есть таблица, в которой хранятся все файлы, связанные с определенным запросом (определенный запрос может иметь несколько или несколько связанных файлов). Я использовал функцию download_zip_file, чтобы загрузить все файлы сразу. Но, к сожалению, я получаю ошибку, которая гласит: "[WinError 3] Система не может найти указанный путь: '/media/documents/my_needs_Zxvf8IN.docx'" Файл, который находится в url ошибки, существует. Я не знаю, что вызвало ошибку и как ее исправить. Есть ли у кого-нибудь подсказка? Моя функция загрузки zip здесь:
@login_required
def download_zip_file(request, docreq_id):
doc_req = Documents.objects.get(id=docreq_id)
if doc_req.sent_from_assignee:
doc_ups = AMdocDocuments.objects.filter(docrequest__pk=docreq_id)
filenames = list(map(lambda f: f.doc_file.url, doc_ups))
zip_subdir = "%s %s" % (doc_req.request_title, doc_req.user_email)
zip_filename = "%s.zip" % zip_subdir
s = BytesIO()
zf = zipfile.ZipFile(s, "w")
for i, fpath in enumerate(filenames):
fname = fpath.split("/")[-1]
# Rename uploaded files to doc file
ext = fname.split(".")[-1]
if ext:
fname = '%s' % smart_str(doc_ups[i].amdoc.doc_name + "." + ext)
zip_path = "%s %s" % (zip_subdir, fname)
zf.write(fpath, zip_path)
zf.close()
resp = HttpResponse(s.getvalue(), content_type="application/x-zip-compressed")
resp['Content-Disposition'] = 'attachment; filename=%s' % zip_filename
return resp
return Http404
вот мои ссылки:
from django.urls import path
from . import views
app_name = 'account'
urlpatterns = [
path('login/', views.user_login, name='login'),
path('signup/', views.user_signup, name='signup'),
path('dashboard/', views.user_dashboard, name='dashboard'),
path('logout/', views.user_logout, name='logout'),
path('password_reset/', views.password_reset_request, name="password_reset"),
# TEST
path('document/', views.docrequest_list, name='docrequest_list'),
path('document/update/<int:pk>/', views.docrequest_update, name='docrequest_update'),
path('download/<int:docrequp_id>/', views.download_document, name='download-docrequpdate'),
path('download-zip/<int:docreq_id>/', views.download_zip_file, name='download-zip-docrequpdate')
]
моя модель:
class AMdocDocuments (models.Model):
amdoc = models.ForeignKey(AMdoc, on_delete=models.CASCADE, null=True, blank=True)
docrequest = models.ForeignKey(Documents, on_delete=models.CASCADE, null=True, blank=True)
doc_file = models.FileField(upload_to='documents/', null=True, blank=True)
def filename(self):
return os.path.basename(self.doc_file.name)
и ошибка:
FileNotFoundError at /account/download-zip/16/
[WinError 3] The system cannot find the path specified: '/media/documents/my_needs_Zxvf8IN.docx'
Request Method: GET
Request URL: http://127.0.0.1:8000/account/download-zip/16/
Django Version: 3.2.6
Exception Type: FileNotFoundError
Exception Value:
[WinError 3] The system cannot find the path specified: '/media/documents/my_needs_Zxvf8IN.docx'
Exception Location: D:\Users\User\AppData\Local\Programs\Python\Python39\lib\zipfile.py, line 501, in from_file
Python Executable: D:\ChangeCapitalSpain\VirtualRoom\Scripts\python.exe
Python Version: 3.9.6
Python Path:
['D:\\ChangeCapitalSpain\\CCSpain',
'D:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python39\\python39.zip',
'D:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python39\\DLLs',
'D:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python39\\lib',
'D:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python39',
'D:\\ChangeCapitalSpain\\VirtualRoom',
'D:\\ChangeCapitalSpain\\VirtualRoom\\lib\\site-packages']
Server time: Mon, 30 Aug 2021 17:36:56 +0200
Еще раз напоминаю: файл для загрузки (имя файла и папка, в которой он находится, верны).То есть папки media/document существуют и файл с точным именем существует в них, и кажется, что ошибка возникла в этой строке:
zf.write(fpath, zip_path)