调整Django媒体文件存储路径后出现文件不存在错误求助
Django媒体文件存储报错排查:
[Errno 2] No such file or directory: '/tmp/tmp1d93dhp7.upload.mp4' 调整Django项目媒体文件存储位置后触发上述错误,已排查settings、views、models中的路径拼写问题,网站核心功能为将用户上传文件存储至media文件夹,错误由uploaded_file.save()代码行引发。
相关代码
views.py
... if form.is_valid() and 'file' in request.FILES: if not request.session.get('user_id'): request.session['user_id'] = generate_unique_id() user_id = request.session.get('user_id') uploaded_file = request.FILES.getlist('file') for file in uploaded_file: fs = FileSystemStorage(location=settings.MEDIA_ROOT) # Use MEDIA_ROOT for permanent storage filename = fs.save(file.name, file) uploaded_file_path = fs.path(filename) file_type = mimetypes.guess_type(uploaded_file_path) request.session['uploaded_file_path'] = uploaded_file_path #user_doc, created = RequirementsChat.objects.get_or_create(id=user_id) user_doc, created = RequirementsChat.objects.get_or_create(id=user_id) uploaded_file = UploadedFile(input_file=file, requirements_chat=user_doc, chat_id = user_id) uploaded_file.save() user_doc.save() #save details user_doc, created = RequirementsChat.objects.get_or_create(id = user_id) user_doc.alias = alias user_doc.email = email user_doc.language = language user_doc.due_date = due_date user_doc.subtitle_type = subtitle_type user_doc.transcript_file_type = transcript_file_type user_doc.additional_requirements = additional_requirements user_doc.date = timezone.now() user_doc.save() return HttpResponse(status=200) ...
models.py
class RequirementsChat(models.Model): id = models.CharField(primary_key=True, max_length=40) alias = models.CharField(max_length=20, blank=True, null=True) email = models.CharField(max_length=100, blank=True, null=True) language = models.CharField(max_length=10, blank=True, null=True) due_date = models.CharField(max_length=10, blank=True, null=True) subtitle_type = models.CharField(max_length=10, blank=True, null=True) transcript_file_type = models.CharField(max_length=10, blank=True, null=True) additional_requirements = models.TextField(max_length=500, blank=True, null=True) date = models.DateTimeField(auto_now_add=True, blank=True, null=True) url = models.CharField(max_length=250, blank=True, null=True) task_completed = models.BooleanField(default=False) class UploadedFile(models.Model): input_file = models.FileField(upload_to='human_upload/')#new chat_id = models.CharField(max_length=40, null= True) requirements_chat = models.ForeignKey(RequirementsChat, on_delete=models.CASCADE, related_name='uploaded_files', null=True)
settings.py
MEDIA_URL='/media/' MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
urls.py
urlpatterns = [ path('', include('homepage.urls')),#redirects to transcribe/, path('transcribe/', include('transcribe.urls')), path('human/', include('human.urls')), path('admin/', admin.site.urls), ]+ static( settings.MEDIA_URL, document_root=settings.MEDIA_ROOT )
文件夹结构
mysite > media> human_upload
问题原因
你在views中先通过FileSystemStorage将文件保存到了MEDIA_ROOT,但创建UploadedFile对象时传入的仍是request.FILES中的原始临时文件对象——该临时文件在FileSystemStorage.save()操作后,指针已移动至文件末尾,甚至可能被系统清理,导致Django的FileField尝试读取时找不到文件路径,触发报错。
解决方案
方案一:移除手动FileSystemStorage操作(推荐)
FileField会自动根据upload_to参数处理文件存储,无需手动调用FileSystemStorage,可避免重复操作和临时文件问题:
if form.is_valid() and 'file' in request.FILES: if not request.session.get('user_id'): request.session['user_id'] = generate_unique_id() user_id = request.session.get('user_id') uploaded_files = request.FILES.getlist('file') for file in uploaded_files: user_doc, created = RequirementsChat.objects.get_or_create(id=user_id) # 直接用原始文件对象创建UploadedFile,FileField自动处理存储到human_upload目录 uploaded_file = UploadedFile(input_file=file, requirements_chat=user_doc, chat_id=user_id) uploaded_file.save() # 保存用户详情 user_doc.alias = alias user_doc.email = email user_doc.language = language user_doc.due_date = due_date user_doc.subtitle_type = subtitle_type user_doc.transcript_file_type = transcript_file_type user_doc.additional_requirements = additional_requirements user_doc.date = timezone.now() user_doc.save() return HttpResponse(status=200)
方案二:保留FileSystemStorage时使用已保存文件
若必须手动执行文件保存,需传入已保存到MEDIA_ROOT的文件对象,而非原始临时文件:
for file in uploaded_file: fs = FileSystemStorage(location=settings.MEDIA_ROOT) # 直接指定存储到human_upload子目录 filename = fs.save(f'human_upload/{file.name}', file) # 打开已保存的文件传入UploadedFile with fs.open(filename) as saved_file: user_doc, created = RequirementsChat.objects.get_or_create(id=user_id) uploaded_file = UploadedFile(input_file=saved_file, requirements_chat=user_doc, chat_id=user_id) uploaded_file.save() # 后续用户详情保存代码...
额外检查项
- 确认
media和human_upload目录存在,且Django进程拥有读写权限,可执行命令:mkdir -p media/human_upload && chmod 755 media/human_upload - 验证
BASE_DIR是否正确指向项目根目录,可在settings中添加print(BASE_DIR)查看输出
内容的提问来源于stack exchange,提问作者tthheemmaannii
相关产品推荐
相关产品推荐

