Django调用uploaded_file_url出现文件不存在IOError问题求助
问题回顾
你在处理Django文件上传时,调用uploaded_file_url遭遇了IOError: No such file or directory: '/media/sample_6bYaPzY.py'的报错,但手动确认目录和文件明明存在。相关代码片段大致如下:
uploaded_file_url=None uploaded_file_url2=None def upload(request): if request.method == 'POST': myfile=request.FILES['myfile'] myfile2=request.FILES["myfile2"] fs = FileSystemStorage() filename = fs.save(myfile.name, myfile) # 后续获取uploaded_file_url的逻辑
可能的原因及解决办法
核对MEDIA_ROOT与MEDIA_URL的配置一致性
先检查settings.py里的关键配置:MEDIA_ROOT = os.path.join(BASE_DIR, 'media') # 必须是文件实际存储的绝对路径 MEDIA_URL = '/media/'很多时候问题出在这里:比如你手动检查的目录是
/home/yourproject/media/,但MEDIA_ROOT误配置成了'/media/'(根目录下的media),这时候Django会去根目录找文件,自然找不到。可以在代码里加一行print(fs.location),打印FileSystemStorage实际使用的存储路径,和你手动检查的路径对比是否完全匹配。检查文件权限
就算文件存在,Django运行的进程(比如开发服务器的用户、uwsgi/nginx对应的用户)可能没有读取权限。用命令查看权限:ls -l /media/sample_6bYaPzY.py如果文件所有者是root,而Django运行在
www-data用户下,就会触发权限问题。可以修改权限:sudo chown www-data:www-data /media/sample_6bYaPzY.py sudo chmod 644 /media/sample_6bYaPzY.py确保获取文件URL的方式正确
必须用FileSystemStorage自带的url()方法生成URL,不要手动拼接路径:filename = fs.save(myfile.name, myfile) uploaded_file_url = fs.url(filename) # 这是正确的姿势要是你手动拼接
'/media/' + filename,一旦MEDIA_URL配置变更(比如改成'/static/media/'),就会出现路径错误。注意文件名自动重命名的坑
报错里的sample_6bYaPzY.py带有随机后缀,说明Django因为文件名重复自动重命名了文件。如果你后续逻辑里用了原文件名sample.py去访问,而不是fs.save()返回的sample_6bYaPzY.py,肯定会找不到文件。一定要用保存后的文件名来构建路径或URL。
快速排查小技巧
在代码里加几行打印日志,直观查看关键信息:
import os fs = FileSystemStorage() print(f"存储目录:{fs.location}") # 打印实际存储的物理目录 filename = fs.save(myfile.name, myfile) print(f"保存后的文件名:{filename}") # 打印Django实际保存的文件名 print(f"完整物理路径:{os.path.join(fs.location, filename)}") # 打印文件的绝对路径
对比这个完整路径和你手动检查的路径,往往能发现细微的路径差异问题。
内容的提问来源于stack exchange,提问作者Dinesh Kumar

