当前位置:   article > 正文

django实现类似admin后台上传文件的方法_adminer上传文件

adminer上传文件

在项目过程中,也许我们需要上传一张图片,或者需要上传一份文件,那么有什么方式既简单又有效呢,使用django该怎么做呢?

本文是自己在开发中有需要摸索出来的,使用了REST-framework如果有更好的方式,烦请留言相告,不胜感激!!

前端使用input标签选择文件,后端接受post请求上传文件,以文件流的方式保存文件。文件路径在settings.py配置

1、django的安装启动就不在赘述了

2、 在settings.py配置上传的路径

  1. FILE_URL = "static/%Y/%m/files/" # 例如将文件放在项目目录下的static/2018/12/files/下(将在代码中做格式化)
  2. FILE_ROOT = os.path.join(BASE_DIR, FILE_URL) # 文件目录绝对路径

2、创建好模型

用户模型也不再赘述了。可以使用自带的认证用户模型。

  1. class File(BaseModel):
  2. # upload_to参数是后台admin上传图片的保存位置,我们后续自己写的接口,图片也保存在这个位置
  3. file = models.FileField(upload_to=settings.FILE_URL, verbose_name="文件选择")
  4. name = models.CharField(max_length=200, blank=True, verbose_name="文件名称")
  5. class Meta:
  6. db_table = 'test_file'
  7. verbose_name = "文件"
  8. verbose_name_plural = verbose_name
  9. def __str(self):
  10. return self.name

3、迁移数据库,在项目目录下使用命令

python manage.py createsuperuser

创建好admin超级用户。(本来是无需创建的,这里只是为了做测试)

4、 在当前应用app下的admin.py注册模型

  1. from django.contrib import admin
  2. from .models import File
  3. admin.site.register(File)

5、python manage.py runserver 开启django服务器,打开默认网址127.0.0.1:8000/admin,登录admin超级管理员,就可以看到

点击模型,增加文件。保存。查看数据库,会发现

超级管理员是好办,已经完成了,文件就在项目目录下的static/2018/12/files/下。

可是我们的重点是自己实现这个过程,前端页面自己写上传来的。啰嗦了好久,进入正题!

在app下的views.py写好后端接口

  1. import os
  2. import datetime
  3. from django.conf import settings
  4. from rest_framework.views import APIView
  5. from rest_framework.response import Response
  6. from .serializers import FileSerializer
  7. from .models import File
  8. class FileView(APIView):
  9. def get(self, request):
  10. """获取指定id的文件,前端传入id"""
  11. file_id = request.GET.get("id")
  12. try:
  13. file = File.objects.get(id=int(file_id)) # 查询
  14. except Exception as e:
  15. return Response({"file": '', 'error': 'file does not exist'})
  16. serializer = FileSerializer(instance=file) # 返回数据的序列化器
  17. return Response(serializer.data)
  18. def post(self, request):
  19. """上传文件的接口"""
  20. file_obj = request.FILES.get('file') # 获取前端的文件
  21. file_uuid = request.POST.get('uuid') # uuid
  22. file_name = file_uuid + file_obj.name # 重新组成file_name
  23. time = datetime.datetime.now()
  24. file_root = time.strftime(settings.FILE_ROOT) # 格式化保存路径
  25. if os.path.exists(file_root):
  26. pass
  27. else:
  28. os.makedirs(file_root) # 路径不存在就建立文件夹
  29. file_path = os.path.join(file_root, file_name) # 文件路径
  30. f = open(file_path, 'wb')
  31. # 写入保存上传的文件
  32. for chunk in file_obj.chunks():
  33. f.write(chunk)
  34. f.close()
  35. file_url = time.strftime(settings.FILE_URL) + file_name
  36. file = File.objects.create(
  37. file=file_url,
  38. name=file_obj.name,
  39. )
  40. file.save()
  41. return Response({"status": "upload success!", "file": file_url}) # 成功返回状态及文件的路径

配置好后端访问的urls

  1. from django.urls import path
  2. from . import views
  3. urlpatterns = [
  4. path(r'file/', views.FileView.as_view())
  5. ]
  6. # 这是app下的url,项目的url请自行喜欢配置哈

补充序列化器serialisers.py:

  1. from rest_framework import serializers
  2. from .models import File
  3. class FileSerializer(serializers.ModelSerializer):
  4. class Meta:
  5. model = File
  6. fields = '__all__'

6、写好前端html页面

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>上传文件</title>
  6. <link rel="stylesheet" href="css/upload_file.css">
  7. <script type="text/javascript" src="js/jquery-1.7.2.min.js"></script>
  8. {# 配置后端的接口域名host.js文件内容就一行#}
  9. {# var host = "http://127.0.0.1:8000/";#}
  10. <script type="text/javascript" src="js/host.js"></script>
  11. <script type="text/javascript" src="js/upload_file.js"></script>
  12. </head>
  13. <body>
  14. <div class="uploadFile">
  15. <input type="file" id="upFile">
  16. <input type="button" value="上传" id="fileSubmit" style="display: block; margin-top: 10px">
  17. </div>
  18. </body>
  19. </html>

7. uplode_file.js

  1. $(function(){
  2. // 点击上传按钮触发上传事件,如果想选择好文件就上传可以使用$("#upFile").change()函数
  3. $("#fileSubmit").click(function(){
  4. var formData = new FormData();
  5. var file = $("#upFile").get(0).files[0]; // 获取input选入的文件内容
  6. var uuid = generateUUID(); // 生成uuid
  7. formData.append('file', file); // 加入数据表单
  8. formData.append('uuid', uuid); // 传入uuid
  9. $.ajax({
  10. url: 'http://127.0.0.1:8000/file/', // 后端django接口
  11. type: "POST",
  12. data:formData,
  13. processData: false,
  14. contentType: false,
  15. success: function(data){
  16. alert("success!");
  17. },
  18. error: function(e){
  19. alert("网络错误,请稍后再试!\n")
  20. }
  21. })
  22. });
  23. // 生成唯一的uuid,上传相同的文件一样保存
  24. function generateUUID() {
  25. var d = new Date().getTime();
  26. if(window.performance && typeof window.performance.now === "function"){
  27. d += performance.now(); //use high-precision timer if available
  28. }
  29. var uuid = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
  30. var r = (d + Math.random()*16)%16 | 0;
  31. d = Math.floor(d/16);
  32. return (c=='x' ? r : (r&0x3|0x8)).toString(16);
  33. });
  34. return uuid;
  35. }
  36. })

最后!运行django服务器,开启前端页面,选择文件,上传。

成功后会在项目目录下生成static文件夹。一层层进里面就躺着我们上传的文件啦!

打开数据库查看,file字段与我们后台admin配置的upload_to上传的一样。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/399028
推荐阅读
相关标签
  

闽ICP备14008679号