由于django-mdeditor官方插件没有支持第三方存储,所以,我们只能进行修改源码的方式实现了。

本次改写即使替换了其文件,不使用七牛云也是无关紧要的,因为在存储时,去settings.py中判断是否启用七牛云存储,只有配置了七牛云相关信息才会执行,否则还是原先的方式存储在本地。

源文件路径venv\Lib\site-packages\mdeditor\views.py

使用方法

  • 修改源文件

    源文件路径venv\Lib\site-packages\mdeditor\views.py 找到该文件,将下面的代码直接复制全文替换
# -*- coding:utf-8 -*-
import os
import datetime from django.views import generic
from django.conf import settings
from django.http import JsonResponse
from django.views.decorators.csrf import csrf_exempt
from django.utils.decorators import method_decorator
from .configs import MDConfig # TODO 此处获取default配置,当用户设置了其他配置时,此处无效,需要进一步完善
MDEDITOR_CONFIGS = MDConfig('default') class UploadView(generic.View):
""" upload image file """ @method_decorator(csrf_exempt)
def dispatch(self, *args, **kwargs):
return super(UploadView, self).dispatch(*args, **kwargs) def post(self, request, *args, **kwargs):
upload_image = request.FILES.get("editormd-image-file", None)
media_root = settings.MEDIA_ROOT # image none check
if not upload_image:
return JsonResponse({
'success': 0,
'message': "未获取到要上传的图片",
'url': ""
}) # image format check
file_name_list = upload_image.name.split('.')
file_extension = file_name_list.pop(-1)
file_name = '.'.join(file_name_list)
if file_extension not in MDEDITOR_CONFIGS['upload_image_formats']:
return JsonResponse({
'success': 0,
'message': "上传图片格式错误,允许上传图片格式为:%s" % ','.join(
MDEDITOR_CONFIGS['upload_image_formats']),
'url': ""
}) # image floder check
file_path = os.path.join(media_root, MDEDITOR_CONFIGS['image_folder'])
if not os.path.exists(file_path):
try:
os.makedirs(file_path)
except Exception as err:
return JsonResponse({
'success': 0,
'message': "上传失败:%s" % str(err),
'url': ""
}) # save image
try:
use_qiniu = settings.MDEDITOR_USE_QINIU
if use_qiniu:
import qiniu,shortuuid
from qiniu.http import ResponseInfo
from urllib import parse
qiniu_save = QiniuSave()
save_name,url = qiniu_save.save(file_extension,upload_image)
qiniu_save.dealwith_img(save_name)
qiniu_save.cdn_flush(save_name)
else:
url = save_img_local(file_name, file_path, upload_image, file_extension)
except AttributeError:
url = save_img_local(file_name, file_path, upload_image, file_extension) return JsonResponse({'success': 1,
'message': "上传成功!",
'url': url}) def save_img_local(self, file_name, file_path, upload_image, file_extension):
'''将文件存储到本地'''
file_full_name = '%s_%s.%s' % (file_name, '{0:%Y%m%d%H%M%S%f}'.format(datetime.datetime.now()),
file_extension)
with open(os.path.join(file_path, file_full_name), 'wb+') as file:
for chunk in upload_image.chunks():
file.write(chunk)
url = os.path.join(settings.MEDIA_URL, MDEDITOR_CONFIGS['image_folder'], file_full_name)
return url class QiniuSave():
def __init__(
self,
access_key=settings.QINIU_ACCESS_KEY,
secret_key=settings.QINIU_SECRET_KEY,
bucket_name=settings.QINIU_BUCKET_NAME,
bucket_domain=settings.QINIU_BUCKET_DOMAIN,
):
self.auth = qiniu.Auth(access_key, secret_key)
self.bucket_name = bucket_name
self.bucket_domain = bucket_domain
self.bucket_manager = qiniu.BucketManager(self.auth) def re_name(self,file_extension):
name = shortuuid.uuid() +'.'+ file_extension
return name def save(self, file_extension, content): if hasattr(content, 'chunks'):
content_str = b''.join(chunk for chunk in content.chunks())
else:
content_str = content.read()
name = self.re_name(file_extension)
self._put_file(name, content_str)
url = parse.urljoin(self.bucket_domain, name)
return name,url def _put_file(self, name, content):
token = self.auth.upload_token(self.bucket_name)
ret, info = qiniu.put_data(token, name, content)
if ret is None or ret['key'] != name:
raise QiniuError(info) # 将上传处理后的图片刷新到cdn节点,减少回源流量
def cdn_flush(self,key):
cdn_manager = qiniu.CdnManager(self.auth)
domine = self.bucket_name
need_flush_url = domine + key
# 需要刷新的文件链接
urls = [
need_flush_url,
]
# URL刷新链接
refresh_url_result = cdn_manager.refresh_urls(urls)
return # 进行上传的图片处理
def dealwith_img(self,key):
q = self.auth
bucket_name = self.bucket_name
# pipeline是使用的队列名称,不设置代表不使用私有队列,使用公有队列。
# pipeline = 'your_pipeline'
# 要进行的转换格式操作。
# fops = 'imageView2/0/format/webp/interlace/1'
fops = 'imageMogr2/format/webp'
# 可以对缩略后的文件进行使用saveas参数自定义命名,当然也可以不指定文件会默认命名并保存在当前空间
saveas_key = qiniu.urlsafe_base64_encode(bucket_name + ':' + key)
fops = fops + '|saveas/' + saveas_key
# pfop = qiniu.PersistentFop(q, bucket_name, pipeline)
pfop = qiniu.PersistentFop(q, bucket_name)
ops = []
ops.append(fops)
ret, info = pfop.execute(key, ops, 1)
assert ret['persistentId'] is not None
return class QiniuError(IOError): def __init__(self, value):
if isinstance("Debuf Info", ResponseInfo):
super(QiniuError, self).__init__(
"Qiniu Response Info %s" % value
)
else:
super(QiniuError, self).__init__(value)
  • 在django的settings.py中配置
# mdeitor配置
MDEDITOR_USE_QINIU = True
# qiniuyun QINIU_ACCESS_KEY = '七牛云账号的access_key'
QINIU_SECRET_KEY = '七牛云账号的secret_key'
QINIU_BUCKET_NAME = '七牛云的空间名称'
QINIU_BUCKET_DOMAIN = '七牛云空间绑定的自定义的cdn加速域名,格式:http://example.com或者:https://example.com'

django-mdeditor支持七牛云存储图片的更多相关文章

  1. Django项目使用七牛云存储图片

    Django项目使用七牛云存储图片 最近,写了一个django项目,想在项目中使用七牛云存储上传图片,在网上搜索到django-qiniu-storage,查看文档,按步骤居然设置成功了. 安装 1 ...

  2. xadmin引入django-qiniu-storage七牛云存储图片

    一.注册七牛云账号: 1.注册并完成实名认证 2.创建公有存储空间 二.安装django-qiniu-storage: pip install django-qiniu-storage 安装djang ...

  3. ueditor上传图片到七牛云存储(form api,java)

    转:http://my.oschina.net/duoduo3369/blog/174655 ueditor上传图片到七牛云存储 ueditor结合七牛传图片 七牛的试炼 开发前的准备与注意事项说明 ...

  4. PHP使用七牛云存储之图片的上传、下载、303重定向教程,CI框架实例

    网上关于七牛云存储的教程除了官网上的API文档,其他的资料太少了.研究了下API之后,现在已经能实现图片的上传和下载及上传之后的重定向. http://blog.csdn.net/cqcre/arti ...

  5. Ueditor结合七牛云存储上传图片、附件和图片在线管理的实现和最新更新

    最新下载地址: https://github.com/widuu/qiniu_ueditor_1.4.3 Ueditor七牛云存储版本 注意事项 老版本请查看 : https://github.com ...

  6. 为七牛云存储开发的PHP PEAR 包:Services_Qiniu

    七牛云存储Qiniu Resource (Cloud) Storage:用于存储图片.apk等静态资源. 优点: 1.使用七牛带宽和CDN,速度快,不占用开发者服务器. 2.支持图片任意格式.任意分辨 ...

  7. CodeIgniter - 集成七牛云存储

    最近有一个项目需要集成七牛云存储的图片存储和调用功能,程序是基于CodeIgniter2.1.3的PHP框架.刚拿到手完全无从下手的感觉,因为像框架这种东西,想从官方的PHPSDK集成进去,需要改动很 ...

  8. 七牛云存储Python SDK使用教程 - 上传策略详解

    文 七牛云存储Python SDK使用教程 - 上传策略详解 七牛云存储 python-sdk 七牛云存储教程 jemygraw 2015年01月04日发布 推荐 1 推荐 收藏 2 收藏,2.7k  ...

  9. 【UEditor】远程上传图片到【七牛云存储】

    杂谈:最近在玩一个第三方的微信开发平台,里面的图片都是上传到[七牛云存储]的,用了一下非常的好用,支持各种语言,SDK齐全.支持全分布式系统架构以及存储技术和数据加速,于是决定将网站的图片都存储到七牛 ...

随机推荐

  1. 20200322_【转载】关于C#中使用SQLite自适应Any CPU程序的说明

    本文转载, 原文链接: http://luyutao.com/2016/09/14/csharp-sqlite-any-cpu.html 在C#中如果要使程序自适应32位和64位系统,只需要将项目的& ...

  2. spring + quartz 分布式自定义注解

    相关技术 本文采用spring + quartz的方案.使用mysql作为任务的持久化,支持分布式. 自定义注解 1.启用定时任务 @Target(ElementType.TYPE) @Retenti ...

  3. PyQt(Python+Qt)学习随笔:树型部件QTreeWidget的itemAbove、itemBelow方法作用探究

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 在QTreeWidget的方法中,对于itemBelow.itemAbove方法,官网文档介绍非常简 ...

  4. 第15.5节 PyQt的历史沿革介绍

    当朋友向我推荐PyQt时,老猿才知道有这样一个在Python下的开源的图形界面开发工具,当准备学习PyQt安装时,发现要安装sip.PyQt.PyQt-tools,然后还要进行相关配置.老猿很好奇为什 ...

  5. 稀疏矩阵三元组表快速转置(C语言实现)

    本来准备昨天下午写的,但是因为去参加360众测靶场的考核耽搁了,靶场的题目还是挺基础的. 继续学习吧. 使用黑色墨水在白纸上签名就像由像素点构成的稀疏矩阵.如图4所示. 图4 手写体签名 [问题]请将 ...

  6. THE BUG 队第一次团队作业

    1.队名: THE BUG 队 2.队员学号: 杨梓琦 3118005115(队长) 温海源,3118005109 陈杰才,3118005089 李华,3118005097 钟明康,311800512 ...

  7. 步步为营,打造CQUILib UI框架库

    步步为营,打造CQUILib UI框架库 UI框架包括如下几个方面:: 丰富的UI控件 窗口管理 主题 多语言 托盘 视图与业务解耦 登录框效果如下:: 提示框效果如下:: 后续讲解如何步步为营,打造 ...

  8. VMware虚拟机下Centos8 设置静态IP地址

    缘起 我们在平时学习Redis.Nginx等分布式微服务的组件的时候,无法避免的需要用到Linux操作系统,而Linux操作系统的主机来源差不多就三种情况: 真实物理机 阿里云等云服务器 利用虚拟机 ...

  9. JApiDocs(自动生成接口文档神器)

    JApiDocs教程 前言 作为一名优秀的程序员来说,由于涉及到要与前端进行对接,所以避免不了的就是写接口文档.写完接口文档,一旦代码返回结果,参数等出现变动,接口文档还得随之改动,十分麻烦,违背了我 ...

  10. MBR分区表为什么最大只能识别2TB硬盘容量

    1. 前言 最近公司的服务器硬盘坏了,需要换一个新的硬盘,容量是2TB,用的fdisk进行分区,期间搜索分区工具,看到了关于MBR(Master Boot Record)与GPT(GUID parti ...