经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » Django » 查看文章
Django项目中使用plupload插件实现上传图片功能
来源:cnblogs  作者:记住我忘记我  时间:2019/8/9 8:55:11  对本文有异议

首先下载plupload插件放在static静态文件下面,官方地址:https://www.plupload.com/

项目根目录下创建media文件夹用来存放上传的图片,配置settings文件,添加media的文件路径

  1. MEDIA_ROOT = os.path.join(BASE_DIR,'media')

先写前端html页面

  1. {# 引入插件#}
  2. <script src="/static/plupload/moxie.js"></script>
  3. <script src="/static/plupload/plupload.min.js"></script>
  4. {#定义上传图片的按键和显示位置#}
  5. <div class="sbox f_l"><span>上传图片</span>
  6. {% for i in img %}
  7. <img src="{{ i.src }}" alt="">
  8. {% endfor %}
  9. <h2><a id="upload_image_name" src="javascript:;"><input type="button" value="上传图片"></a></h2>
  10. <ul id="image_name_list"></ul>
  11. {# <a href="/" class="read">点击阅读</a>#}
  12. </div>

写前端js语法

  1. {#上传图片#}
  2. <script language="JavaScript">
  3.  
  4.  
  5. var msgLayero_upload_image_name;
  6. var index_upload_image_name;
  7. var layer_upload_image_name = 1;
  8. //实例化一个plupload上传对象
  9. var uploader_upload_image_name = new plupload.Uploader({
  10. browse_button: 'upload_image_name', //触发文件选择对话框的按钮,为那个元素id
  11. url: '/apply/upload/', //服务器端的上传页面地址
  12. flash_swf_url: '/static/plupload/Moxie.swf', //swf文件,当需要使用swf方式进行上传时需要配置该参数
  13. silverlight_xap_url: '/static/plupload/Moxie.xap', //silverlight文件,当需要使用silverlight方式进行上传时需要配置该参数
  14. multipart_params: {
  15. type: 'image_name',
  16. csrfmiddlewaretoken: "{{ csrf_token }}"
  17. },
  18. resize: {
  19. width: 800//指定压缩后图片的宽度,如果没有设置该属性则默认为原始图片的宽度
  20. //height: , //指定压缩后图片的高度,如果没有设置该属性则默认为原始图片的高度
  21. //crop: false //是否裁剪图片
  22. },
  23. filters: {
  24. max_file_size: '4mb'
  25. },
  26. init: {
  27. //选择文件
  28. FilesAdded: function (up, files) {
  29. //加载层
  30. index_upload_image_name = layer.msg('上传中...', {
  31. icon: 16, time: 0,
  32. shade: 0.01,
  33. success: function (layero, index) {
  34. msgLayero_upload_image_name = layero;//是加载层的div
  35. }
  36. });
  37. //layer_upload_image_name = layer.msg('上传中...', {time: 0}); //不自动关闭
  38. uploader_upload_image_name.start();
  39. },
  40. UploadProgress: function (up, file) { //上传中,显示进度条
  41. var percent = file.percent;
  42. msgLayero_upload_image_name.find('.layui-layer-content').html('<i class="layui-layer-ico layui-layer-ico1"></i>上传中...' + percent + '%');
  43. },//单个文件上传完成
  44. FileUploaded: function (up, file, responseObject) {
  45. console.log($.parseJSON(responseObject.response));//成功回调函数
  46. {# $('#image_name_list').html('');#}
  47. var result = $.parseJSON(responseObject.response);
  48. if (result.status == 1) {
  49. //上传成功
  50. var htmls = '<li class="img_upload" style="position:relative;margin:0 10px -10px 0;">';
  51. htmls += '<input type="hidden" name="image_name[]" value="' + result.file + '">'; //隐藏域,是为了把图片地址入库。。
  52. htmls += ' <img src="' + result.file + '" width="250" >';
  53. htmls += '<span style="position:absolute;top:-8px;right:-6px;background-color:#fff;border-radius:10px;"><a href=javascript:; class="delImg" data-val="' + result.file + '">&nbsp;<img src="/static/images/del.png" width="15" /></a></span>';
  54. htmls += '</li>';
  55. {# $('#image_name_list').append(htmls);为可同时上传多张图片,$('#image_name_list').html(htmls);为一次智能上传一张图片#}
  56. $('#image_name_list').append(htmls);
  57. //上传成功的弹出框
  58. msgLayero_upload_image_name.find('.layui-layer-content').html('<i class="layui-layer-ico layui-layer-ico1"></i>' + result.message);
  59. } else {
  60. //上传失败的弹出框
  61. msgLayero_upload_image_name.find('.layui-layer-content').html('<i class="layui-layer-ico layui-layer-ico2"></i>' + result.message);
  62. }
  63. setTimeout(function () {
  64. layer.close(index_upload_image_name);
  65. }, 2000);
  66. },
  67. //全部文件上传完成
  68. UploadComplete: function (up, files) {
  69. setTimeout(function () {
  70. layer.close(index_upload_image_name);
  71. }, 2000);
  72. },
  73. //返回错误
  74. Error: function (up, err) {
  75. msgLayero_upload_image_name.find('.layui-layer-content').html('<i class="layui-layer-ico layui-layer-ico2"></i>' + result.message);
  76. setTimeout(function () {
  77. layer.close(index_upload_image_name);
  78. }, 2000);
  79. }
  80. }
  81. });
  82. uploader_upload_image_name.init();
  83. {# 删除准备上传的图片#}
  84. $(document).on('click', '.delImg', function () {
  85. _this = this;
  86. $.post('{% url "apply:delimg/" %}', {
  87. path: $(_this).data("val"),
  88. csrfmiddlewaretoken: "{{ csrf_token }}"
  89. }, function (json) {
  90. if (json.status == 1) {
  91. layer.msg("删除成功", {
  92. time: 2000 //2s后自动关闭
  93. });
  94. $(_this).parent().parent().remove();
  95. } else {
  96. layer.msg("删除失败", {
  97. time: 2000 //2s后自动关闭
  98. });
  99. }
  100. }, 'json');
  101. });
  102. </script>

django后台,先创建路由

  1. from django.urls import path,include,re_path
  2. from apply.views import apply
  3. urlpatterns = [
  4. path('index/',apply.index,name='index/'),
  5. path('about/',apply.about,name='about/'),
  6. path('info/',apply.info,name='info/'),
  7. path('list/',apply.list,name='list/'),
  8. path('time/',apply.time,name='time/'),
  9. path('fanyi/',apply.fanyi,name='fanyi/'),
  10. # 上传图片
  11. path('upload/',apply.upload,name='upload/'),
  12. # 删除准备上传的图片
  13. path('delimg/',apply.delimg,name='delimg/'),
  14. ]

写方法。

  1. from django.shortcuts import render,redirect,HttpResponse
    from apply.utils import function
    from blacker import settings
    import os
    import json
    from apply.models import *

  2. #
    上传图片
  3. def upload(request):
  4. img_obj = request.FILES.get("file") # 通过前台提交过来的图片资源 img_obj.name avatar.jpg
  5. range_num = function.range_num(15) # 生成一个15位随机数
  6.  
  7. print(img_obj.name)
  8. img_type = os.path.splitext(img_obj.name)[1] # .jpg 获取文件名后缀
  9. new_img_path = os.path.join(settings.MEDIA_ROOT,
  10. range_num + img_type) # E:\ftp\code\www\pro\media\add_article_img\676161546271228.jpg #/media/add_article_img/123456.jpg
  11. print(new_img_path)
  12. img_type2 = img_type.replace(".", "") # png
  13. with open(new_img_path, "wb") as f:
  14. for line in img_obj:
  15. f.write(line)
  16. response = {
  17. "status": 1,
  18. "message": "上传成功",
  19. 'file': '/media/'+range_num + img_type+'/',
  20. 'file_type': img_type2
  21. }
  22. res = Media.objects.create(src='/media/'+range_num + img_type+'/')
  23. return HttpResponse(json.dumps(response))
  24. # 删除正在上传的图片
  25. def delimg(request):
  26. print(12)
  27. img_path = request.POST.get('path') # /media/add_article_img/722264423391172.jpg
  28. # img_name = os.path.split(img_path)[-1] # 获取图片名称 722264423391172.jpg
  29. img_name = img_path.split('/')[-2] # 获取图片名称 722264423391172.jpg
  30. img_new_path = os.path.join(settings.MEDIA_ROOT,img_name) # E:\ftp\code\www\pro\media\add_article_img\722264423391172.jpg
  31. if not os.remove(img_new_path):
  32. response = {
  33. "status": 1,
  34. "message": "删除成功"
  35. }
  36. return HttpResponse(json.dumps(response))

方法里面有用到function.range_num函数,这是一个封装的产生随机数函数,在应用目录下创建utils文件夹,并创建function.py文件,内容如下

  1. import random
  2. # 随机数
  3. def range_num(num):
  4. # 定义一个种子,从这里面随机拿出一个值,可以是字母
  5. seeds = "1234567890"
  6. # 定义一个空列表,每次循环,将拿到的值,加入列表
  7. random_num = []
  8. # choice函数:每次从seeds拿一个值,加入列表
  9. for i in range(num):
  10. random_num.append(random.choice(seeds))
  11. # 将列表里的值,变成四位字符串
  12. return "" . join(random_num)#5454

上传发现图片上传成功,但是页面不能正常显示;

需要再配置路由,

  1. from django.contrib import admin
  2. from django.urls import path,include,re_path
  3. from apply.views import apply
  4. from django.views.static import serve
  5. from blacker import settings
  6. urlpatterns = [
  7. re_path(r'^media/(?P<path>.*)', serve, {"document_root":settings.MEDIA_ROOT}),
  8. path('',apply.index,name='index/'),
  9. path('admin/', admin.site.urls),
  10. path('apply/',include(('apply.urls','apply')))
  11. ]

 

配置后在上传图片如图所示

 

同时图片已写入数据库,从数据库获取数据并写在页面上;

done。

 

原文链接:http://www.cnblogs.com/nmsghgnv/p/11321751.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号