在Django项目里,文件上传功能通常借助模型中的FileField或ImageField实现,上传后的文件由存储系统统一管理。正确处理上传文件并获取其路径,是很多开发者在搭建用户头像、附件下载等功能时必须要掌握的技能。

基础配置
首先需要在settings.py中配置文件存储的根目录与访问前缀:
# settings.py MEDIA_ROOT = os.path.join(BASE_DIR, 'media') MEDIA_URL = '/media/'
MEDIA_ROOT是服务器上实际保存文件的文件夹,MEDIA_URL是浏览器访问这些文件时的基础地址。
定义携带文件的模型
使用FileField可以让Django自动处理文件的保存逻辑:
# models.py
from django.db import models
class UserProfile(models.Model):
username = models.CharField(max_length=50)
avatar = models.FileField(upload_to='avatars/')
def get_file_path(self):
# 返回文件在MEDIA_ROOT下的相对路径
return self.avatar.name
def get_access_url(self):
# 返回浏览器可访问的地址
return self.avatar.url
在视图中处理上传并获取路径
在视图函数里,我们可以通过request.FILES接收文件,并调用模型保存:
# views.py
from django.shortcuts import render
from .models import UserProfile
def upload_avatar(request):
if request.method == 'POST':
form_file = request.FILES.get('avatar')
profile = UserProfile(username='test', avatar=form_file)
profile.save()
# 获取保存后的相对路径与访问地址
saved_path = profile.get_file_path()
access_url = profile.get_access_url()
return render(request, 'done.html', {'path': saved_path, 'url': access_url})
return render(request, 'upload.html')
常见错误做法
有些开发者会手动拼接路径,例如写成 MEDIA_ROOT + '/' + filename,这种做法在跨平台或upload_to含子目录时极易出错。应当始终使用字段自带的name与url属性。
模板中展示文件链接
在模板里直接输出url属性即可生成正确链接:
<!-- done.html -->
<p>文件已保存,相对路径:{{ path }}</p>
<p>访问地址:<a href="{{ url }}">点击查看</a></p>
开发环境访问配置
若要在本地调试时直接访问上传文件,需在urls.py增加静态文件路由:
# urls.py
from django.conf import settings
from django.conf.urls.static import static
urlpatterns = [
# 其他路由
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
小结
正确获取Django上传文件路径的核心在于:依赖FileField的name获取存储相对路径,用url获取访问地址,避免手写字符串拼接。这样既安全又兼容各种存储后端。