今天测试上传图片的时候,发现一只报错说找不到文件:FileNotFoundError
通过检查路径的输出,发现首先在settings配置路径的时候有问题
MEDIA_ROOT=os.path.join(BASE_DIR,'/static/media')
这里多了一个/ 所以导致拼接后的路径是由C盘开始的,而不是项目路径开始的 (C:/static/media/filename.jpg)
MEDIA_ROOT=os.path.join(BASE_DIR,'static/media')
改为这样后,仍然提示找不到上传文件路径
后来发现,报错的路径C:\Users\Admin\PycharmProjects\chuanzhi_test_dj2/static/media/filename.jpg
里是直接项目路径就到了/static/media
而我的的/static/media其实是建立在一个APP下的
于是又把路径改为:
MEDIA_ROOT=os.path.join(BASE_DIR,'img_test/static/media')
之后就成功啦
之前一直以为是保存上传文件的问题,(上传不成功,所以没有找到文件)当仔细检查后,就发现其实是那个用来保存上传文件的路径没对,程序找不到应该保存在哪,自然也不会写入文件
另外注意写入文件要用'wb' =============================================
另:关于显示上传后的图片,其实这个可以使用显示静态文件的方法,不过由于上传文件放在/static/media所以路径需要稍作修改
views.py:
from chuanzhi_test_dj2 import settings 要引入settings才有MEDIA_ROOT
def uploadHandler(request):
if request.method=='POST':
file=request.FILES['pic']
filedir="%s/%s" %(settings.MEDIA_ROOT,file.name) #这里在settings配置MEDIA_ROOT=os.path.join(BASE_DIR,'img_test/static/media')注意添加了APP路径
#其实当发现文件路径有问题就可以输出路径来看,检查数据路径和我们的项目结构是否对应
context={'filedir':"media/"+file.name,}
#我的做法是先在这里拼接了media/filename路径,因为模板中使用static的话能自动找到APP下的static文件夹,所以只需再加一层media with open(filedir,'wb') as pic: #写入这里注意用wb
for c in file.chunks():
pic.write(c) return render(request,'img_test/showUploadFile.html',context) else:
return HttpResponse('error') 模板:
{% load static from staticfiles %} 这里和静态文件处理一样导入
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<img src="{% static filedir %}" alt=""> 把前面view传来的路径media/filename.xxx放到static后就会自动在static下找media/filename.xxx
<hr> </body>
</html>
而urls.py配置如常:
app_name='img' urlpatterns=[
re_path('upload_img/$',uploadImg,name='upload_img'),
re_path('uploadHandler/',uploadHandler,name='uploadHandler'),
]