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

Django中glob获取文件列表返回空数组问题求助

解决Django中上传文件后无法找到目标文件的问题

看起来你遇到的核心问题是Django运行时的工作目录与你预期不符,加上直接用glob查找最新文件的方式不够可靠,咱们一步步来解决:

1. 先修正路径问题(最可能的原因)

你用../media/temp_files/*这种相对路径时,Django的工作目录其实是项目的根目录(就是你运行python manage.py runserver的那个目录),而不是当前app的目录。所以../会指向项目根目录的上级,自然找不到文件。

正确的做法是基于settings.MEDIA_ROOT构建绝对路径,而且要确保路径拼接正确:

from django.conf import settings
import os

# 构建绝对路径
temp_dir = os.path.join(settings.MEDIA_ROOT, 'temp_files')
list_of_files = glob.glob(os.path.join(temp_dir, '*'))

这样不管Django的工作目录是什么,都能准确指向你的临时文件目录。

2. 更可靠的方式:直接使用上传后的文件对象路径

其实你根本不需要用glob去查找最新文件!因为serializer.save()已经返回了保存后的file对象,你可以直接获取它的绝对路径:

@api_view(['POST', 'GET'])
def geojson_to_shape_view(request):
    if request.method == 'POST':
        serializer = FileSerializer(data=request.data)
        if serializer.is_valid():
            file = serializer.save()
            # 直接获取文件的绝对路径(注意:这里的file字段名要和你的序列化器里的字段对应)
            file_path = file.file.path  
            print(f"Processing file: {file_path}")
            
            # 这里添加你的文件处理逻辑
            
            # 处理完删除原文件
            try:
                # 先关闭文件句柄,确保写入完成
                file.file.close()
                os.remove(file_path)
                print("File deleted successfully")
            except Exception as e:
                print(f"Can't remove the file: {str(e)}")
            
            return Response(FileSerializer(file).data, status=status.HTTP_201_CREATED)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

这种方式完全避免了查找文件的问题,而且更高效、准确,不会因为文件创建时间的微小误差找错文件。

3. 排查权限问题

如果上面的方法还是不行,再检查权限:

  • 确保MEDIA_ROOT/temp_files目录的所有者是Django运行的用户(本地运行的话就是你的系统用户,生产环境可能是www-data之类的)
  • 目录权限设置为至少755,文件权限设置为644,确保Django有读写权限。

内容的提问来源于stack exchange,提问作者leonardofmed

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 06:27:57