本地图片上传到服务器,其本质上来讲,就是读取本地图片,复制到服务器,并返回服务器url

前端代码,用的form表单提交,form表单中包含两个文件选择表单元素,选择文件,点击提交按钮,提交form表单

服务端代码如下:

def get_path_format_vars():

  return { 

    "year":datetime.now().strftime("%Y"),
    "month":datetime.now().strftime("%m"),
    "day":datetime.now().strftime("%d"),
    "date":datetime.now().strftime("%Y%m%d"),
    "time":datetime.now().strftime("%H%M%S"),
    "datetime":datetime.now().strftime("%Y%m%d%H%M%S"),
    "rnd":random.randrange(100,999),
  }

def GetOutputFileInfo(request, path_format, path_format_vars):

  # 将保存的文件路径和配置的静态资源连接起来

  outputPath = os.path.join(MEDIA_ROOT, path_format)  # 这里MEDIA_ROOT是在settings文件中配置的静态资源路径  MEDIA_ROOT = os.path.join(BASE_DIR, "media")

  # 拼接文件名

  outputFile = "%(basename)s_%(datetime)s_%(rnd)s.%(extname)s"%path_format_vars

  outputFile = outputFile.replace("/","_")

  # 将文件夹路径和文件名拼接起来,生成带完整路径的文件路径,用于返回给前端

  outputPathFormat = os.path.join(path_format, outputFile)

  # 文件路径是否存在,如果不存在则创建一个

  if not os.path.exists(outputPath):

    os.makedirs(outputPath)

  outputPath = outputPath.replace("/","\\")

  outputPathFormat = outputPathFormat.replace("/","\\")

  return(outputPathFormat, outputPath, outputFile)

def UploadFileToServer(request, filePath, file):

  try:

    # 以二进制格式写入文件

    f = open(filePath, "wb")

    for chunk in file.chunks():

      f.write(chunk)

  except Exception as e:

    f.close()

    return u"写入文件错误{}".format(e.message)

  finally:

    f.close()

  return "success"

def UploadFile(request):

  if not request.method == "POST":

    return JsonResponse({"error":u"不支持此种请求"}, safe=False)

  /** 这里涉及到一个问题,就是多图上传获取图片,一直以来我们都是直接使用get来获取但是如果是多图,你会发现get拿到的永远只有一个,经过debug调试我们可以看到,request.FILES是一个MultiValueDict类型,这种字典类型是特殊定义的,要取得list,需要用getlist方法

  **/

  files = request.FILES.getlist("upfile")

  if len(files) == 0:

    return JsonResponse({"error":u"请至少选择一个文件"}, safe=False)

  returnInfors = {}  # 定义一个字典用来承载返回值

  returnInfos["data"] = []

  for file in files:

    filename = file.name

    fileSize = file.size

    # 获取不包括后缀的文件名和文件后缀

    upload_origin_name, upload_origin_ext = os.path.splitext(filename)

    # 自定义允许上传的文件类型

    allType = [".png", ".jpg", ".jpeg", ".gif", ".bmp"]

    # 判断文件上传类型

    if not upload_origin_ext in allType:

      return JsonResponse({"error":u"服务器不允许上传%s类型的文件"%upload_origin_ext}, safe = False)

    # 判断上传文件的大小

    maxSize = 10485760  # 自定义上传文件大小限制10M

    if fileSize > maxSize:

      return JsonResponse({"error":u"文件大小不能超过%s"}%maxSize)

    # 校验做完了,开始正式上传文件

    path_format_var = get_path_format_vars()  # 获取时间相关参数,用于拼接文件名

    path_format_var.update({

      "basename":upload_origin_name,

      "extname":upload_origin_ext[1:],

      "filename":filename

    })

    # 取得文件输出的路径

    outputPathFormat = "forum/images"

    outputFormat, outputPath, outputFile = GetOutputFileInfo(request, outputPathFormat , path_format_vars)

    

    # 开始写入文件

    state = UploadFileToServer(request, outputPath, outputFile)

    # 写完,将结果返回给前端

    mediaurl = urljoin(MEDIA_URL, outputFormat)  # MEDIA_URL 也是settings文件中配置的静态资源路径 MEDIA_URL = '/media/'

    # 将绝对路径返回给前端

    abs_url = request.build_absolute_uri(mediaurl)

    return_info = {

      "url":abs_url,

      "original":upload_origin_name,

      "type":upload_origin_ext,

      "size":fileSize,

      "state":state

    }

    returnInfos["data"].append(return_info)

  return JsonResponse(returnInfos)

    

def GetFileUpload(request):

  return UploadFile(request)

python实现本地图片上传到服务区的更多相关文章

  1. TinyMCE的使用(包括汉化及本地图片上传功能)

    TinyMCE我就不多介绍了,这是下载地址:https://www.tinymce.com/download/ 下载下来是英文版,要汉化也很简单.首先去网上随便下载个汉化包,然后把汉化包解压后的lan ...

  2. 本地图片上传与H5适配知识

    最近用到本地图片上传作为API的参数,在网上看了许多,记录一下,以后可能用的着(仅自己记录用,看不清请绕路) function getObjectURL(file) { var url = null ...

  3. JavaScript实现本地图片上传前进行裁剪预览

    本项目支持IE8+,测试环境IE8,IE9,IE10,IE11,Chrome,FireFox测试通过 另:本项目并不支持Vue,React等,也不建议,引入JQuery和Vue.React本身提倡的开 ...

  4. JS兼容各个浏览器的本地图片上传即时预览效果

    JS兼容各个浏览器的本地图片上传即时预览效果 很早以前 在工作曾经碰到这么一个需求,当时也是纠结了很久,也是google了很久,没有碰到合适的demo,今天特意研究了下这方面的的问题,所以也就做了个简 ...

  5. 【咸鱼教程】本地图片上传。动态GIF表情图生成

    本案例参考:http://emoji.decathlon.trustingme.cn/但是实现方式不一样. 教程目录一 head first二 打开本地图片功能三 拖拽和缩放手势,调整图片四 gifj ...

  6. 本地图片上传到GitHub,MarkDown使用Github图片地址

    最近在学习用markdown编辑器,我是直接用有道云笔记编辑的,感觉真的好好用,编辑了一半的博客,可以按样式保存在云笔记中,我再也不会忘记写博客了~~ 但是在编辑博客的时候发现了一个问题,那就是本地图 ...

  7. DWZ集成的xhEditor编辑器浏览本地图片上传的设置

    有关xhEditor的文件上传配置官方文档链接:http://i.hdu.edu.cn/dcp/dcp/comm/xheditor/demos/demo08.html 一.xhEditor图片上传的配 ...

  8. JavaScript实现本地图片上传预览功能(兼容IE、chrome、FF)

    需要解决的问题有:本地图片如何在上传前预览.编辑:最近发现这个功能很多是基于flash实现的,很多JavaScript实现的代码兼容性都很差,特别是在IE和firefox和chrome三个浏览器上不兼 ...

  9. [转]微信小程序开发之从相册获取图片 使用相机拍照 本地图片上传

    本文转自:http://blog.csdn.net/qq_31383345/article/details/53014610 今天遇到微信小程序的用户头像设置功能,做笔记. 先上gif: 再上代码: ...

随机推荐

  1. aspectj eclipse4.6下载地址

    http://www.eclipse.org/ajdt/downloads/#46zips

  2. python第一百一十一天 --Django 6 model 的相关操作

    创建数据库,设计表结构和字段 使用 MySQLdb 来连接数据库,并编写数据访问层代码 业务逻辑层去调用数据访问层执行数据库操作 import MySQLdb def GetList(sql): db ...

  3. Fatal error: Can't open and lock privilege tables: Table 'mysql.host' doesn't exist

    今天在用一键安装mysql的shell脚本安装mysql-5.1.73软件后发现mysql始终无法启动,多次执行后依旧报错,只能去查看error日志,发现了如下的2个错误: 错误一:Fatal err ...

  4. Android项目的targetSDK>=23,在低于Android6.0的部分测试机(类似华为)上运行时出现的系统权限问题

    相信大家对Android6.0以上的动态权限已经有所了解,很多童鞋也已经跃跃欲试地将自己项目的targetSDK升级到了23及其以上,很不幸的是我也成为了其中一员,然而我还是图样图森破了,升级之后的问 ...

  5. C++多线程同步技巧(二)--- 事件

    简介 Windows在线程控制方面提供了多种信号处理机制,其中一种便是使用 CreateEvent() 函数创建事件,然后使用信号控制线程运行.其中将事件变为有信号可使用 SetEvent() 函数, ...

  6. #000 Python 入门第一题通过扩展,学到了更多的知识

    #1写在前面的话 我觉得这样学习或许能够在学习的过程中事半功倍 第一道简单的python编写代码输出10行带标号的“Hello,world.”,具体效果参阅输入输出示例 1:Hello,world. ...

  7. Java JDK与JRE

    JDK与JRE JDK(Java Development Kit):Java开发工具包.包含JRE中的所有内容,以及用于开发小应用程序和应用程序的编译器和调试器等工具. JRE(Java Runtim ...

  8. 微信小程序本地引用iconfont(阿里巴巴矢量图标库)

    好,忙,我懂..... 首先把图标放进项目里(废话): 接下来把这些图标下载到本地(这里不介绍网络途径了,下载就完事了) 然后利用一个网站将这个ttf文件转成base64文件https://trans ...

  9. Linux最终将会领先于Windows、Mac OS!

    Linux最终将会领先于Windows.Mac OS! 众所周知,硬件离开了软件就像人失去灵魂,而操作系统作为软件中的基础部分,更是重中之重!无论手机.电脑.还是服务器一旦离开了操作系统,比之一堆废铁 ...

  10. [转]Oracle 清除incident和trace -- ADRCI用法

    在oracle11g中,dump file的目录已经有所改变,bdump和udump整合到trace中,cdump独立出一个. E:\ora11g\app\Administrator\diag\rdb ...