1. 建路由
  2. 创建方法
  3. 渲染页面
  4. 下载plupload插件。将插件放在项目根目录下的static下
  5. 写页面,引入js,写html
  6. 这个容器:放上传的图片

    当上传后,需要ul里放3要素:

    元素1:隐藏Input:值:图片路径,当点击发布文章时,将此路径提交后台,上传数据库

    元素2:<img src=‘’>显示已上传的图片,给用户观看

    元素3:<span><img src=’del.jpg’> </span>删除图标。为了删除图片

    引入js:ajax把图片资源提交到后台。修改元素:按钮id  url:上传后台图片的路径  拼接htmls

  7. 通过这段js,将图片资源提交到后台 url: '/back/article/upload2/',

    1.  建路由:/back/article/upload2/
    2. 建方法upload2:将前台提交的资源,生成一张图

删除图片

1 页面上有这样的html :class="delImg"    data-val="/media/add_article_img/267693612471283.jpg"

2 <a href="javascript:;" class="delImg" data-val="/media/add_article_img/267693612471283.jpg"> <img src="/static/images/del.png" width="15"></a>

3 写js:

点击删除按钮,获取删除按钮上的图片路径 ,通过ajax把图片路径提交后台

4 建删除图片路由{% url "back:article/delImg/" %}

5 建方法delImg:

获取图片路径,os.remove(img_new_path)删除图片

utils:

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

settings:

#用户上传的文件配置
MEDIA_ROOT = os.path.join(BASE_DIR,'media')
MEDIA_URL='/media/'

views:

def gbook(request):
''''''
text = request.POST.get('text')
img = re.findall('<img src="/media/(.*?)" alt=".*?"(.*?)/>',text)
if img == None:
img = '/static/picture/762f99f369ae786f970477feeb3b9d77.jpg'
from app01.utils import function
import os.path
#pupload上传多图片
def upload2(request):
print(1)
img_obj=request.FILES.get("file")#通过前台提交过来的图片资源 img_obj.name avatar.jpg
range_num=function.range_num(15)#生成一个15位随机数 # print(img_obj.name)
img_type=os.path.splitext(img_obj.name)[1]#.jpg 获取文件名后缀
new_img_path=os.path.join(settings.MEDIA_ROOT,"add_article_img",range_num+img_type)#E:\ftp\code\www\pro\media\add_article_img\676161546271228.jpg #/media/add_article_img/123456.jpg img_type2 = img_type.replace(".", "") #png # print(new_img_path)
with open(new_img_path,"wb") as f:
for line in img_obj:
f.write(line) response={
"status":1,
"message":"上传成功",
'file':"/media/add_article_img/"+range_num+img_type,
'file_type':img_type2
}
print(response['file'])
return HttpResponse(json.dumps(response)) def delImg(request):
'''删除多图'''
img_path=request.POST.get('path')#/media/add_article_img/722264423391172.jpg
img_name=os.path.split(img_path)[1]#获取图片名称 722264423391172.jpg
img_new_path=os.path.join(settings.MEDIA_ROOT,"add_article_img",img_name)#E:\ftp\code\www\pro\media\add_article_img\722264423391172.jpg
if not os.remove(img_new_path):
response={
"status":1,
"message":"删除成功"
}
return HttpResponse(json.dumps(response))

html:

<li>
<a id="upload_image_name" src="javascript:;">
<input type="button" value="上传图片">
</a>
<ul id="image_name_list"></ul>
</li> <script language="JavaScript">
var msgLayero_upload_image_name;
var index_upload_image_name;
var layer_upload_image_name = 1;
//实例化一个plupload上传对象
var uploader_upload_image_name = new plupload.Uploader({
browse_button: 'upload_image_name', //触发文件选择对话框的按钮,为那个元素id
url: '/app01/upload2/', //服务器端的上传页面地址
flash_swf_url: '/static/plupload/Moxie.swf', //swf文件,当需要使用swf方式进行上传时需要配置该参数
silverlight_xap_url: '/static/plupload/Moxie.xap', //silverlight文件,当需要使用silverlight方式进行上传时需要配置该参数
multipart_params: {
type: 'image_name',
csrfmiddlewaretoken: "{{ csrf_token }}"
},
resize: {
width: 800//指定压缩后图片的宽度,如果没有设置该属性则默认为原始图片的宽度
//height: , //指定压缩后图片的高度,如果没有设置该属性则默认为原始图片的高度
//crop: false //是否裁剪图片
},
filters: {
max_file_size: '4mb'
},
init: {
//选择文件
FilesAdded: function (up, files) {
//加载层
index_upload_image_name = layer.msg('上传中...', {
icon: 16, time: 0,
shade: 0.01,
success: function (layero, index) {
msgLayero_upload_image_name = layero;//是加载层的div
}
});
//layer_upload_image_name = layer.msg('上传中...', {time: 0}); //不自动关闭
uploader_upload_image_name.start();
},
UploadProgress: function (up, file) { //上传中,显示进度条
var percent = file.percent;
msgLayero_upload_image_name.find('.layui-layer-content').html('<i class="layui-layer-ico layui-layer-ico1"></i>上传中...' + percent + '%'); },//单个文件上传完成
FileUploaded: function (up, file, responseObject) {
console.log($.parseJSON(responseObject.response));//成功回调函数 $('#image_name_list').html('');
var result = $.parseJSON(responseObject.response);
if (result.status == 1) {
//上传成功
var htmls = '<li class="img_upload" style="position:relative;margin:0 10px -10px 0;">';
htmls += '<input type="hidden" name="image_name[]" value="' + result.file + '">'; //隐藏域,是为了把图片地址入库。。
htmls += ' <img src="' + result.file + '" width="250" />';
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>';
htmls += '</li>'; $('#image_name_list').append(htmls);
//上传成功的弹出框
msgLayero_upload_image_name.find('.layui-layer-content').html('<i class="layui-layer-ico layui-layer-ico1"></i>' + result.message); } else {
//上传失败的弹出框
msgLayero_upload_image_name.find('.layui-layer-content').html('<i class="layui-layer-ico layui-layer-ico2"></i>' + result.message); }
setTimeout(function () {
layer.close(index_upload_image_name);
}, 2000); },
//全部文件上传完成
UploadComplete: function (up, files) {
setTimeout(function () {
layer.close(index_upload_image_name);
}, 2000);
},
//返回错误
Error: function (up, err) {
msgLayero_upload_image_name.find('.layui-layer-content').html('<i class="layui-layer-ico layui-layer-ico2"></i>' + result.message);
setTimeout(function () {
layer.close(index_upload_image_name);
}, 2000);
}
}
}); uploader_upload_image_name.init(); $(document).on('click', '.delImg', function () {
_this=this;
$.post('{% url "app01:delImg" %}', {
path: $(_this).data("val"),
csrfmiddlewaretoken: "{{ csrf_token }}"
}, function (json) {
if (json.status == 1) {
layer.msg("删除成功", {
time: 2000 //2s后自动关闭
});
$(_this).parent().parent().remove();
} else {
layer.msg("删除失败", {
time: 2000 //2s后自动关闭
});
}
}, 'json');
}); </script>

python-Web-django-图片上传的更多相关文章

  1. Web Api 图片上传,在使用 Task.ContinueWith 变量无法赋值问题

    细谈 Web Api 图片上传,在使用 Task.ContinueWith 变量无法赋值问题的解决办法!   在使用Asp.Net Web Api 图片上传接口的时候,到网上找了一些个例子,但大多数找 ...

  2. web前端图片上传(3)--filereader

    这篇文章主要是为了介绍一种文件上传的方式.当然文件中是包含图片的.如果大家仔细看我的第一篇web前端图片上传(1)就会知道,其实也是按照这种方式上传你的,但是由于上次时间比较紧张,没有详细的介绍今天的 ...

  3. Asp.Net Core Web Api图片上传(一)集成MongoDB存储实例教程

    Asp.Net Core Web Api图片上传及MongoDB存储实例教程(一) 图片或者文件上传相信大家在开发中应该都会用到吧,有的时候还要对图片生成缩略图.那么如何在Asp.Net Core W ...

  4. 细谈 Web Api 图片上传,在使用 Task.ContinueWith 变量无法赋值问题的解决办法!

    在使用Asp.Net Web Api 图片上传接口的时候,到网上找了一些个例子,但大多数找到都是这个版本! [HttpPost] public Task<Hashtable> ImgUpl ...

  5. web前端图片上传

    图片上传有很多种形式,但是听说ios只能传字符串,所以为了安卓.ios和web能用一个接口上传图片,采用了基于base64 的方法上传图片. 下面是我的html <div class=" ...

  6. 配置django图片上传与保存展示

    近来在研究django,发现有好多好玩的功能,比如图片上传,以前处理这个比较麻烦,现在我们来看看如何来处理图片上传与保存 1.在数据库设计的时候需要配置upload_to image = models ...

  7. django 图片上传与显示

    由于图片上传的需要,学习了一波上传 1. 上传 前端代码 <form action="写上相应的定向位置" method="post" enctype=& ...

  8. [python][flask] Flask 图片上传与下载例子(支持漂亮的拖拽上传)

    目录 1.效果预览 2.新增逻辑概览 3.tuchuang.py 逻辑介绍 3.1 图片上传 3.2 图片合法检查 3.3 图片下载 4.__init__.py 逻辑介绍 5.upload.html ...

  9. java web开发 图片上传功能

    基本思路在于,配置路径,然后用java I/O的api将图片上传到该目录下. String photoPath =    ServletActionContext.getServletContext( ...

  10. python实现本地图片上传到服务区

    本地图片上传到服务器,其本质上来讲,就是读取本地图片,复制到服务器,并返回服务器url 前端代码,用的form表单提交,form表单中包含两个文件选择表单元素,选择文件,点击提交按钮,提交form表单 ...

随机推荐

  1. Gym - 101908J Joining Capitals (斯坦纳树)

    题意:二维平面上有n(n<=100)个点,其中k个是星星(k<=10),现要构造一棵树,每个星星对应树上的一个叶子结点,求最小花费(总花费为树上所有边的长度(两点间欧几里得距离)) 斯坦纳 ...

  2. .NET界面开发神器:DevExpress全新发布v19.1.7!快来试用

    DevExpress Universal Subscription(又名DevExpress宇宙版或DXperience Universal Suite)是全球使用广泛的.NET用户界面控件套包,De ...

  3. java.sql.SQLException: Unknown column 'user0_.user_name' in 'field list' 报错问题

    报错信息: java.sql.SQLException: Unknown column 'user0_.user_name' in 'field list'Query is: select user0 ...

  4. sql条件子查询

    https://www.cnblogs.com/wxw16/p/6105624.html select * from mst_crse where crse_cd in (SELECT crse_cd ...

  5. 使用Navicat客户端运行SQL语句出现中文乱码

    出现乱码无非就是编码方式不统一造成的,通过查阅资料解决了问题. (简 体中文系统环境支持国标 GB2312.GB18030 和 Unicode (UTF-8) 编码.它们在系统中设置的locale(亦 ...

  6. SpringBoot项目中,Mybatis的使用

    项目中使用MyBatis的地方很少,可以说是基本不用,慕课网上面这个项目介绍给也就是一些比较简单的使用例子,我用JPA比较的多,MyBatis有两种使用方式 1.导入MyBatis的依赖 <de ...

  7. poj 3069 贪心+区间问题

    Saruman's Army Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 5989   Accepted: 3056 De ...

  8. python-pyhs2

    #!/usr/bin/env python # -*- coding: utf-8 -*- # hive util with hive server2 """ @auth ...

  9. [题解] [CF518D] Ilya and Escalator

    题面 题解 期望dp入门题 设\(f[i][j]\)为到\(i\)时间有\(j\)个人上了电梯的概率, 我们可以得到转移方程 \[ f[i][j]=\begin{cases}f[i-1][j]\cdo ...

  10. 微信公众号实现无限制推送模板消息!可向指定openID群发

    微信认证的服务号才有推送模板消息接口所以本文需要在认证服务号的情况下学习 以上就是模板消息,只有文字和跳转链接,没有封面图.在服务号的后台添加功能插件-模板消息即可. 模板消息,都是在后台选择一个群发 ...