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
相关产品推荐
相关产品推荐

