You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

调整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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 01:06:03