因为今年参加了中国软件杯,选择的项目为 http://cnsoftbei.com/plus/view.php?aid=581
其中的一个要求为:
- 数据源接入:支持对接 PostgreSQL 数据仓库(如 Greenplum、EDB 等),支持本地上传 csv/xlsx 文件;
百度到的代码都跟屎一样,自己琢磨了一下,研究出了一个比较简洁的文件上传案例
首先,为了上传文件,我们肯定需要在 HTML 中写一个 form, 然后 form 里又会有一个 action, 我们就先处理这个 action
为了完成这个文章的内容,请你自己按照 Django 的文档,创建一个 APP, 然后在 APP 内操作
首先,既然我们需要这个 action, 就要在 Django 的 APP 中的 urls 创建一个 path, 用这个 path 对应的函数,来处理这个上传的操作
Django 创建的新 APP 中默认不自带这个 urls.py
文件,如果你没有,可以自行创建一个,然后向内输入如下代码:
- from django.urls import path,include
- from django.conf.urls import url
- from django.conf import settings
- from django.conf.urls.static import static
-
- from . import views
-
- urlpatterns = [
- path('', views.index, name='index'),
- path('upload/', views.upload, name='upload'),
- path('upload_csv_process/', views.upload_csv_process, name='upload_csv_process'),
- ]
-
- if settings.DEBUG:
- urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
其中的 urlpatterns, 是用来配置这个 APP 的路由,这里我的目录结构为根目录是首页,upload 是上传页面,uplaod_csv_process
也是上传页面,页面内容相同,但是 upload_csv_process
调用的是文件上传的函数,这个函数写在了 views.py
中,在上面通过 from . import views
引入了这个函数
其中的 if settings.DEBUG:
也很重要,先写进去,后面说为什么
接下来我们先不用去管 views 中写了什么,先来处理一下 HTML 部分的内容,这部分其实很简单
我们只需要一个 form
, 一个 input type='file'
, 一个 submit
- <form method='POST' action='/upload_csv_process' enctype="multipart/form-data">
- <!-- 其中的action的值为你在urls.py写的处理上传路径的地址, enctype为Django上传文件必有得参数, 不必深究, 带着就行 -->
- <input type='file' name='upload'>
- <button type='submit'>上传</button>
- </form>
OK, HTML 的部分只需要这些就足够了,接下来我们去 views.py 文件中,去处理 HTML 发出的 POST 请求
我们在下面新写一个函数,函数名就是 path('upload/', views.upload_csv_process, name='upload_csv_process')
中的第二个参数 views.
后面的东西,代码如下:
- # 首先需要引入Django的这个包, 用于保存文件
- from django.core.files.storage import default_storage
-
- def upload_csv_process(request):
- # 判断接收到的请求是否为POST并且存在文件
- if request.method == 'POST' and request.FILES:
- # 这里FILES后面的upload是HTML代码中type='file'标签的name值
- file_name = request.FILES['upload'].name
-
- if file_name[-3:] == 'jpg' or file_name[-3:] == 'png':
- uploaded_files = request.FILES['upload']
- name = default_storage.save(file_name, uploaded_files)
- return render(request, 'upload.html', {'status': '上传成功!'})
- else:
- return render(request, 'upload.html', {'status': '上传文件的格式必须为jpg或者png!'})
- # 如果没有接收到文件
- elif not request.FILES:
- return render(request, 'upload.html', {'status': '没有选择文件!'})
- # 这里的return是这个页面的默认页面, 即没有任何操作, 就来到了这个页面, 就什么都不做, 把这个upload.html渲染给他看
- return render(request, 'upload.html')
到这里还没有结束,default_storage.save()
这个函数,第一个参数是文件名,第二个参数是文件本体,执行它之后会去检查存储路径下有没有相同名字的文件,如果有相同文件名,他就会对这个文件名进行处理,存储之后,这个函数会讲它真正存储的文件名 return 回来,我们这里用 name 接收
那它把这个文件存哪去了呢?它存储的路径我们需要自行配置,它会把文件保存到 settings.py
中的 MEDIA_ROOT
值中
首先去 Django 的 settings.py
中,首先配置一下 MEDIA_ROOT 与 MEDIA_URL
- MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
- MEDIA_URL = '/media/'
MEDIA_ROOT 中写的是这个文件要保存到哪个目录,MEDIA_URL 中存的是使用什么 url, 能访问到这个资源
那这里我们写的就是保存图片到 media 文件夹中
如果要访问这个图片资源,假设我们的域名为 localhost, 文件名为 test.png, 访问的 url 就是
- http://localhost/media/test.png
中间的 media 就是 MEDIA_URL
的值,而我们在 urls.py
中写的 if settings.DEBUG:
, 就是让保存函数能知道这个路径是什么
希望这篇文章能帮助到你
学习了
您好~我是腾讯云 + 社区的运营,关注了您分享的技术文章,觉得内容很棒,我们诚挚邀请您加入腾讯云自媒体分享计划。完整福利和申请地址请见:https://cloud.tencent.com/developer/support-plan
作者申请此计划后将作者的文章进行搬迁同步到社区的专栏下,你只需要简单填写一下表单申请即可,我们会给作者提供包括流量、云服务器等,另外还有些周边礼物。
礼品窝:礼品真实代发、多种类礼品自由选择、海量发件仓,价格 0.8 元 / 单。http://www.lpwo.cn
感谢分享 赞一个
请博主大人尽快联系我 @(花心)@(花心)
加我 QQ,1565481748