日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

django上傳文件的三種方式

瀏覽:30日期:2024-09-09 09:57:34
Django文件上傳需要考慮的重要事項

文件或圖片一般通過表單進行。用戶在前端點擊文件上傳,然后以POST方式將數(shù)據(jù)和文件提交到服務(wù)器。服務(wù)器在接收到POST請求后需要將其存儲在服務(wù)器上的某個地方。Django默認(rèn)的存儲地址是相對于根目錄的/media/文件夾,存儲的默認(rèn)文件名就是文件本來的名字。上傳的文件如果不大于2.5MB,會先存入服務(wù)器內(nèi)存中,然后再寫入磁盤。如果上傳的文件很大,Django會把文件先存入臨時文件,再寫入磁盤。

Django默認(rèn)處理方式會出現(xiàn)一個問題,所有文件都存儲在一個文件夾里。不同用戶上傳的有相同名字的文件可能會相互覆蓋。另外用戶還可能上傳一些不安全的文件如js和exe文件,我們必需對允許上傳文件的類型進行限制。因此我們在利用Django處理文件上傳時必需考慮如下3個因素:

設(shè)置存儲上傳文件的文件夾地址 對上傳文件進行重命名 對可接受的文件類型進行限制(表單驗證)

注意:以上事項對于上傳圖片是同樣適用的。

Django文件上傳的3種常見方式

Django文件上傳一般有3種方式(如下所示)。我們會針對3種方式分別提供代碼示范。

使用一般的自定義表單上傳,在視圖中手動編寫代碼處理上傳的文件 使用由模型創(chuàng)建的表單(ModelForm)上傳,使用form.save()方法自動存儲 使用Ajax實現(xiàn)文件異步上傳,上傳頁面無需刷新即可顯示新上傳的文件

Ajax文件上傳部分見Django與Ajax交互篇。

項目創(chuàng)建與設(shè)置

我們先使用django-admin startproject命令創(chuàng)建一個叫file_project的項目,然后cd進入file_project, 使用python manage.py startapp創(chuàng)建一個叫file_upload的app。

我們首先需要將file_upload這個app加入到我們項目里,然后設(shè)置/media/和/STATIC_URL/文件夾。我們上傳的文件都會放在/media/文件夾里。我們還需要使用css和js這些靜態(tài)文件,所以需要設(shè)置STATIC_URL。

#file_project/settings.pyINSTALLED_APPS = [ ’django.contrib.admin’, ’django.contrib.auth’, ’django.contrib.contenttypes’, ’django.contrib.sessions’, ’django.contrib.messages’, ’django.contrib.staticfiles’, ’file_upload’,# 新增]STATIC_URL = ’/static/’STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static'), ]MEDIA_ROOT = os.path.join(BASE_DIR, ’media’)MEDIA_URL = ’/media/’#file_project/urls.pyfrom django.contrib import adminfrom django.urls import path, includefrom django.conf import settingsfrom django.conf.urls.static import staticurlpatterns = [ path(’admin/’, admin.site.urls), path(’file/’, include('file_upload.urls')),] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)創(chuàng)建模型

使用Django上傳文件創(chuàng)建模型不是必需,然而如果我們需要對上傳文件進行系統(tǒng)化管理,模型還是很重要的。我們的File模型包括file和upload_method兩個字段。我們通過upload_to選項指定了文件上傳后存儲的地址,并對上傳的文件名進行了重命名。

#file_upload/models.pyfrom django.db import modelsimport osimport uuid# Create your models here.# Define user directory pathdef user_directory_path(instance, filename): ext = filename.split(’.’)[-1] filename = ’{}.{}’.format(uuid.uuid4().hex[:10], ext) return os.path.join('files', filename)class File(models.Model): file = models.FileField(upload_to=user_directory_path, null=True) upload_method = models.CharField(max_length=20, verbose_name='Upload Method')

注意:如果你不使用ModelForm,你還需要手動編寫代碼存儲上傳文件。

URLConf配置

本項目一共包括3個urls, 分別對應(yīng)普通表單上傳,ModelForm上傳和顯示文件清單。

#file_upload/urls.pyfrom django.urls import re_path, pathfrom . import views# namespaceapp_name = 'file_upload'urlpatterns = [ # Upload File Without Using Model Form re_path(r’^upload1/$’, views.file_upload, name=’file_upload’), # Upload Files Using Model Form re_path(r’^upload2/$’, views.model_form_upload, name=’model_form_upload’), # View File List path(’file/’, views.file_list, name=’file_list’),]使用一般表單上傳文件

我們先定義一個一般表單FileUploadForm,并通過clean方法對用戶上傳的文件進行驗證,如果上傳的文件名不以jpg, pdf或xlsx結(jié)尾,將顯示表單驗證錯誤信息。關(guān)于表單的自定義和驗證更多內(nèi)容見Django基礎(chǔ): 表單forms的設(shè)計與使用。

#file_upload/forms.pyfrom django import formsfrom .models import File# Regular formclass FileUploadForm(forms.Form): file = forms.FileField(widget=forms.ClearableFileInput(attrs={’class’: ’form-control’})) upload_method = forms.CharField(label='Upload Method', max_length=20, widget=forms.TextInput(attrs={’class’: ’form-control’})) def clean_file(self):file = self.cleaned_data[’file’]ext = file.name.split(’.’)[-1].lower()if ext not in ['jpg', 'pdf', 'xlsx']: raise forms.ValidationError('Only jpg, pdf and xlsx files are allowed.')# return cleaned data is very important.return file

注意: 使用clean方法對表單字段進行驗證時,別忘了return驗證過的數(shù)據(jù),即cleaned_data。只有返回了cleaned_data, 視圖中才可以使用form.cleaned_data.get(‘xxx’)獲取驗證過的數(shù)據(jù)。

對應(yīng)一般文件上傳的視圖file_upload方法如下所示。當(dāng)用戶的請求方法為POST時,我們通過form.cleaned_data.get(’file’)獲取通過驗證的文件,并調(diào)用自定義的handle_uploaded_file方法來對文件進行重命名,寫入文件。如果用戶的請求方法不為POST,則渲染一個空的FileUploadForm在upload_form.html里。我們還定義了一個file_list方法來顯示文件清單。

#file_upload/views.pyfrom django.shortcuts import render, redirectfrom .models import Filefrom .forms import FileUploadForm, FileUploadModelFormimport osimport uuidfrom django.http import JsonResponsefrom django.template.defaultfilters import filesizeformat# Create your views here.# Show file listdef file_list(request): files = File.objects.all().order_by('-id') return render(request, ’file_upload/file_list.html’, {’files’: files})# Regular file upload without using ModelFormdef file_upload(request): if request.method == 'POST':form = FileUploadForm(request.POST, request.FILES)if form.is_valid(): # get cleaned data upload_method = form.cleaned_data.get('upload_method') raw_file = form.cleaned_data.get('file') new_file = File() new_file.file = handle_uploaded_file(raw_file) new_file.upload_method = upload_method new_file.save() return redirect('/file/') else:form = FileUploadForm() return render(request, ’file_upload/upload_form.html’, {’form’: form, ’heading’: ’Upload files with Regular Form’} )def handle_uploaded_file(file): ext = file.name.split(’.’)[-1] file_name = ’{}.{}’.format(uuid.uuid4().hex[:10], ext) # file path relative to ’media’ folder file_path = os.path.join(’files’, file_name) absolute_file_path = os.path.join(’media’, ’files’, file_name) directory = os.path.dirname(absolute_file_path) if not os.path.exists(directory):os.makedirs(directory) with open(absolute_file_path, ’wb+’) as destination:for chunk in file.chunks(): destination.write(chunk) return file_path

注意:

handle_uploaded_file方法里文件寫入地址必需是包含/media/的絕對路徑,如果/media/files/xxxx.jpg,而該方法返回的地址是相對于/media/文件夾的地址,如/files/xxx.jpg。存在數(shù)據(jù)中字段的是相對地址,而不是絕對地址。 構(gòu)建文件寫入絕對路徑時請用os.path.join方法,因為不同系統(tǒng)文件夾分隔符不一樣。寫入文件前一個良好的習(xí)慣是使用os.path.exists檢查目標(biāo)文件夾是否存在,如果不存在先創(chuàng)建文件夾,再寫入。

上傳表單模板upload_form.html代碼如下:

#file_upload/templates/upload_form.html{% extends 'file_upload/base.html' %}{% block content %}{% if heading %}<h3>{{ heading }}</h3>{% endif %}<form action='' method='post' enctype='multipart/form-data' > {% csrf_token %} {{ form.as_p }} <button type='submit' value='submit'>Upload</button></form>{% endblock %}

顯示文件清單模板file_list.html代碼如下所示:

# file_upload/templates/file_list.html{% extends 'file_upload/base.html' %}{% block content %}<h3>File List</h3><p> <a href='http://m.b3g6.com/file/upload1/' rel='external nofollow' >RegularFormUpload</a> | <a href='http://m.b3g6.com/file/upload2/' rel='external nofollow' >ModelFormUpload</a> | <a href='http://m.b3g6.com/file/upload3/' rel='external nofollow' >AjaxUpload</a></p>{% if files %}<table class='table table-striped'> <tbody> <tr><td>Filename & URL</td><td>Filesize</td><td>Upload Method</td> </tr> {% for file in files %} <tr><td><a href='http://m.b3g6.com/bcjs/{{ file.file.url }}' rel='external nofollow' >{{ file.file.url }}</a></td><td>{{ file.file.size | filesizeformat }}</td><td>{{ file.upload_method }}</td> </tr> {% endfor %} </tbody></table>{% else %}<p>No files uploaded yet. Please click <a href='http://m.b3g6.com/bcjs/{% url ’file_upload:file_upload’ %}' rel='external nofollow' >here</a> to upload files.</p>{% endif %}{% endblock %}

注意:

對于上傳的文件我們可以調(diào)用file.url, file.name和file.size來查看上傳文件的鏈接,地址和大小。 上傳文件的大小默認(rèn)是以B顯示的,數(shù)字非常大。使用Django模板過濾器filesizeformat可以將文件大小顯示為人們可讀的方式,如MB,KB。 使用ModelForm上傳文件

使用ModelForm上傳是小編我推薦的上傳方式,前提是你已經(jīng)在模型中通過upload_to選項自定義了用戶上傳文件存儲地址,并對文件進行了重命名。我們首先要自定義自己的FileUploadModelForm,由File模型重建的。代碼如下所示:

#file_upload/forms.pyfrom django import formsfrom .models import File# Model formclass FileUploadModelForm(forms.ModelForm): class Meta:model = Filefields = (’file’, ’upload_method’,)widgets = { ’upload_method’: forms.TextInput(attrs={’class’: ’form-control’}), ’file’: forms.ClearableFileInput(attrs={’class’: ’form-control’}),} def clean_file(self):file = self.cleaned_data[’file’]ext = file.name.split(’.’)[-1].lower()if ext not in ['jpg', 'pdf', 'xlsx']: raise forms.ValidationError('Only jpg, pdf and xlsx files are allowed.')# return cleaned data is very important.return file

使用ModelForm處理文件上傳的視圖model_form_upload方法非常簡單,只需調(diào)用form.save()即可,無需再手動編寫代碼寫入文件。

#file_upload/views.pyfrom django.shortcuts import render, redirectfrom .models import Filefrom .forms import FileUploadForm, FileUploadModelFormimport osimport uuidfrom django.http import JsonResponsefrom django.template.defaultfilters import filesizeformat# Create your views here.# Upload File with ModelFormdef model_form_upload(request): if request.method == 'POST':form = FileUploadModelForm(request.POST, request.FILES)if form.is_valid(): form.save() # 一句話足以 return redirect('/file/') else:form = FileUploadModelForm() return render(request, ’file_upload/upload_form.html’, {’form’: form,’heading’: ’Upload files with ModelForm’} )

模板跟前面一樣,這里就不展示了。

GitHub源碼地址

https://github.com/shiyunbo/django-file-upload-download

小結(jié)

本文提供并解讀了利用Django上傳文件的3種主要方式(一般表單上傳,ModelForm上傳和Ajax上傳)及示范代碼。

以上就是django上傳文件的三種方式的詳細內(nèi)容,更多關(guān)于django上傳文件的資料請關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Django
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
久久精品资源| 国产精品99一区二区| 野花国产精品入口| 亚洲大片在线| 欧美日韩国产探花| 美女视频网站久久| 麻豆国产精品| 一区二区三区四区日本视频| 麻豆精品蜜桃| 国产综合欧美| 日韩影院免费视频| 欧美综合精品| 麻豆久久一区二区| 中文字幕在线视频久| 亚洲涩涩在线| 一区免费在线| 日本不卡的三区四区五区| 国产欧美精品| 在线天堂中文资源最新版| 国产精品久久久久av电视剧| 久久高清免费| 日韩午夜高潮| 日韩av中文字幕一区二区| 国产精品美女久久久久久不卡| 精品视频高潮| 欧美一区二区三区高清视频| 日韩一级不卡| 日韩欧美精品一区二区综合视频| 国产伦精品一区二区三区千人斩| 老司机精品在线| 99久久久国产精品美女| 一级成人国产| 久久精品午夜| 精品中文一区| 日韩有吗在线观看| 国产精品亚洲综合在线观看| 国际精品欧美精品| 今天的高清视频免费播放成人| 香蕉成人久久| 国产精品www.| 久久久久99| 天海翼精品一区二区三区| 久久精品国产网站| 欧美1级日本1级| 日本91福利区| 亲子伦视频一区二区三区| 综合在线一区| 不卡专区在线| 伊人久久亚洲| 高清精品久久| 另类激情亚洲| 久久精品免费看| 丝瓜av网站精品一区二区 | 亚州欧美在线| 国产aa精品| 另类亚洲自拍| 国产一区调教| 免费在线观看一区二区三区| 久久精品天堂| 久久亚洲电影| 日韩欧美不卡| 欧美精品三级在线| 国精品一区二区三区| 日韩国产在线不卡视频| 天堂8中文在线最新版在线| 日韩有码av| 国产99久久| 麻豆精品av| 久久先锋影音| 日韩在线观看不卡| 久久激情av| 久久成人亚洲| 日韩在线精品| 国产精品成人**免费视频| 六月婷婷一区| 午夜欧美巨大性欧美巨大| 国产精品三p一区二区| 国产亚洲高清视频| 国产成年精品| 日韩激情网站| 老牛国产精品一区的观看方式| 97精品中文字幕| 日韩二区三区在线观看| 国产视频欧美| 99久久久国产精品美女| 国产一区调教| 国产精品免费精品自在线观看| 99亚洲精品| 午夜av不卡| 成人午夜毛片| 国产精品资源| 视频一区日韩精品| 亚洲一区欧美激情| 日韩一区二区在线免费| 国产精品久久久久毛片大屁完整版| 国产精品免费看| 免费高潮视频95在线观看网站| 国产极品模特精品一二| 日韩精品欧美成人高清一区二区| 伊人久久亚洲影院| 亚洲成人二区| 欧美天堂视频| 成人午夜亚洲| 精品一区二区三区中文字幕| 7777精品| 日本免费新一区视频| 亚洲人亚洲人色久| 日韩中文字幕麻豆| 噜噜噜躁狠狠躁狠狠精品视频 | 国产aⅴ精品一区二区四区| 欧美亚洲三区| 日韩激情网站| 啪啪亚洲精品| 奇米狠狠一区二区三区| 日欧美一区二区| 亚洲乱亚洲高清| 亚洲18在线| 91综合久久爱com| 国产日韩一区| 欧美黄色一区二区| 国产伦精品一区二区三区千人斩 | 在线视频日韩| 亚洲一区免费| 视频在线观看国产精品| aa亚洲婷婷| 免费观看在线综合| 亚洲综合色婷婷在线观看| 石原莉奈一区二区三区在线观看| 水野朝阳av一区二区三区| 美美哒免费高清在线观看视频一区二区| 红桃视频欧美| 波多野结衣一区| 免费不卡中文字幕在线| 好看不卡的中文字幕| 99在线观看免费视频精品观看| 一本色道精品久久一区二区三区| 日韩精品一卡二卡三卡四卡无卡| 免费精品视频最新在线| 亚洲精品四区| 欧美日韩午夜电影网| 欧美激情麻豆| 国产一区二区三区天码| 日韩在线观看| 午夜精品亚洲| 亚洲精品乱码| 国产精品一区二区中文字幕| 国产精品极品在线观看| 成人日韩av| 免费国产自久久久久三四区久久| 国产一级久久| 欧美日本不卡| 神马久久午夜| 国产女优一区| 欧美日本久久| 日韩国产一区二区三区| 亚洲视频播放| 国产一卡不卡| 成人美女视频| 日韩在线观看一区二区| 国产探花一区| 亚洲成人一区在线观看| 视频一区在线视频| 欧美日韩一区二区三区不卡视频| 鲁大师精品99久久久| 亚洲国产专区| 日本a级不卡| 麻豆精品蜜桃| 日本综合精品一区| 欧美久久天堂| 深夜福利一区| 欧美天堂视频| 最新亚洲国产| 黑人精品一区| 日韩精品一卡二卡三卡四卡无卡| 国产精品videossex久久发布| 日韩久久电影| 日韩精品一级| 中文在线免费视频| 亚洲一二av| 国产高潮在线| 中文字幕成人| 新版的欧美在线视频| 亚洲精品四区| 日韩和的一区二在线| 日韩高清二区| 久久亚洲精品中文字幕蜜潮电影| 婷婷成人av| 久久黄色影院| 国产欧美啪啪| 美女黄网久久| www.com.cn成人| 欧美日韩一区二区三区不卡视频| 中文在线中文资源| 日韩av二区在线播放| 91精品精品| 国产精品久久久久久模特| 亚洲一区二区三区免费在线观看| 高清日韩中文字幕| 欧美在线黄色| 狠狠色综合网|