
## 文件上傳
### 前端HTML代碼實現
1.在前端中,我們需要填入一個form標簽,然后在這個form標簽中指定enctype="multipart/form-data",不然就不能上傳文件。
2.在form標簽中添加一個input標簽,然后指定input標簽的name,以及type="file"。
```
<form action="" method="post" enctype="multipart/form-data">
<input type="file" name="myfile">
</form>
```
### 后端的代碼實現
后端的主要工作是接收文件。然后存儲文件。接收文件的方式跟接收POST的方式是一樣的,只不過是通過FILES來實現。
```
def save_file(file):
with open('somefile.txt','wb') as fp:
for chunk in file.chunks():
fp.write(chunk)
# with open("abc.txt","w") as f:
# f.write(files.read().decode())
def index(request):
if request.method == 'GET':
form = MyForm()
return render(request,'index.html',{'form':form})
else:
myfile = request.FILES.get('myfile')
save_file(myfile)
return HttpResponse('success')
```
以上代碼通過request.FILES接收到文件后,再寫入到指定的地方。這樣就可以完成一個文件的上傳功能了。
### 使用模型來處理上傳的文件
在定義模型的時候,我們可以給存儲文件的字段指定為FileField,這個Field可以傳遞一個upload_to參數,用來指定上傳上來的文件保存到哪里。比如我們讓他保存到項目的files文件夾下,那么示例代碼如下:
```
# models.py
class Article(models.Model):
title = models.CharField(max_length=100)
content = models.TextField()
thumbnail = models.FileField(upload_to="files")
# views.py
def index(request):
if request.method == 'GET':
return render(request,'index.html')
else:
title = request.POST.get('title')
content = request.POST.get('content')
thumbnail = request.FILES.get('thumbnail')
article = Article(title=title, content=content, thumbnail=thumbnail)
article.save()
return HttpResponse('success')
```
調用完article.save()方法,就會把文件保存到files下面,并且會將這個文件的路徑存儲到數據庫中。
### 指定MEDIA_ROOT和MEDIA_URL
以上我們是使用了upload_to來指定上傳的文件的目錄。我們也可以指定MEDIA_ROOT,就不需要在FielField中指定upload_to,他會自動的將文件上傳到MEDIA_ROOT的目錄下。
```
MEDIA_ROOT = os.path.join(BASE_DIR,'media')
MEDIA_URL = '/media/'
```
然后我們可以在urls.py中添加MEDIA_ROOT目錄下的訪問路徑。示例代碼如下:
```
from django.urls import path
from front import views
from django.conf.urls.static import static
from django.conf import settings
urlpatterns = [
path('', views.index),
] + static(settings.MEDIA_URL,document_root=settings.MEDIA_ROOT)
```
如果我們同時指定MEDIA_ROOT和upload_to,那么會將文件上傳到MEDIA_ROOT下的upload_to文件夾中。示例代碼如下:
```
class Article(models.Model):
title = models.CharField(max_length=100)
content = models.TextField()
thumbnail = models.FileField(upload_to="%Y/%m/%d/")
```
### 限制上傳的文件拓展名
如果想要限制上傳的文件的拓展名,那么我們就需要用到表單來進行限制。我們可以使用普通的Form表單,也可以使用ModelForm,直接從模型中讀取字段。
```
# models.py
class Article(models.Model):
title = models.CharField(max_length=100)
content = models.TextField()
thumbnial = models.FileField(upload_to='%Y/%m/%d/',validators=[validators.FileExtensionValidator(['txt','pdf'])])
files = models.ImageField(upload_to="%Y%m%d")
# forms.py
class BookForms(forms.Form):
files = forms.FileField(validators=[validators.FileExtensionValidator(['txt'],message="必須是TXT")])
# files = forms.ImageField(error_messages={"invalid_image":"格式不對"})
# views.py
class uploadfile(View):
def get(self,request):
return render(request,"upload.html")
def post(self,request):
form = BookForms(request.POST,request.FILES)
if form.is_valid():
title = request.POST.get('title')
files = request.FILES.get('files')
FilesUpload.objects.create(title=title,files=files)
return HttpResponse("success")
else:
print(form.errors.get_json_data())
return HttpResponse("fail")
```
### 上傳圖片
上傳圖片跟上傳普通文件是一樣的。只不過是上傳圖片的時候Django會判斷上傳的文件是否是圖片的格式(除了判斷后綴名,還會判斷是否是可用的圖片)。如果不是,那么就會驗證失敗。我們首先先來定義一個包含ImageField的模型。
```
class Article(models.Model):
title = models.CharField(max_length=100)
content = models.TextField()
thumbnail = models.ImageField(upload_to="%Y/%m/%d/")
```
因為要驗證是否是合格的圖片,因此我們還需要用一個表單來進行驗證。表單我們直接就使用ModelForm就可以了
```
class BookForms(forms.Form):
files = forms.ImageField(error_messages={"invalid_image":"格式不對"})
```
**注意:使用ImageField,必須要先安裝Pillow庫:pip install pillow**
- 空白目錄
- 1-Django前導知識
- 1-1-虛擬環境
- 1-2-Django框架介紹與環境搭建
- 2-URL與視圖
- 2-1-URL與視圖
- 3-模板
- 3-1-模板介紹
- 3-2-模板變量
- 3-3-常用標簽
- 3-4-模板常用過濾器
- 3-5-模板結構優化
- 3-6-加載靜態文件
- 4-數據庫
- 4-1-操作數據庫
- 4-2-圖書管理系統
- 4-3-ORM模型介紹
- 4-4-ORM模型的增刪改查
- 4-5-模型常用屬性
- 4-6-外鍵和表
- 4-7-查詢操作
- 4-8-QuerySet的方法
- 4-9-ORM模型練習
- 4-10-ORM模型遷移
- 5-視圖高級
- 1-Django限制請求method
- 2-頁面重定向
- 3-HttpRequest對象
- 4-HttpResponse對象
- 5-類視圖
- 6-錯誤處理
- 6-表單
- 1-用表單驗證數據
- 2-ModelForm
- 3-文件上傳
- 7-session和cookie
- 1-session和cookie
- 8-memcached
- 1-memcached
- 9-阿里云部署
- 阿里云部署