zoukankan      html  css  js  c++  java
  • Django Rest Framework 使用summernote上传图片(二)

    之前的随笔写过,使用summernote上传图片到本地服务器,但是这样其实不符合实际需求,我们起码会把图片上传到本地的其他服务器。

    先说一下公司需求,为了给测试组写一个工作台,所以要有一个提BUG的界面,选择了summernote的富文本框,因为这是内部的系统,所以没有把图片放到公网服务器上,

    而是把图片放到了公司的SFTP服务器上。已经实现,记录一下。

    首先要修改模型类的属性,pathname = models.CharField(verbose_name=u'路径', max_length=100),之前用的时file字段,但是我们其实保存的只是一个路径。

    之后去网上搜索Django SFTP服务器,集成到项目中,用以连接SFTP服务器和上传,下载图片。

    视图大概是这样:

    class SaveFile(viewsets.ModelViewSet):
      
    # 上传图片
    def create(self, request, *args, **kwargs):
    ftp = SSH(host, port, user, password)
    self.serializer_class = TestFileSerializer
    image_num = request.GET.get('num')# 这里其实是为了获取多张图片,这个和你在js里面的设置有关
    file = request.FILES['ajaxTaskFile' + str(image_num)]
    current = "" # 时间戳
    dir_name = "" # 目录
    seed = "1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!@#$%^&*()_+=-"
    rand_str_list = []
    for i in range(8):
    rand_str_list.append(random.choice(seed))
    rand_str = ''.join(rand_str_list)# 产生随机文件后缀,原因后面解释
    file_name = 'test' + current + rand_str + '.jpg'
    with open(file_name, 'wb+') as temp_file:
    for chunk in file.chunks():
    temp_file.write(chunk)
    ftp.upload(file_name, 图片路径)
    os.remove(file_name)
    data = {
    "objectType": 'bug',
    "pathname": "url?file_name=" + file_name,# 传递这个参数是为了让图片回显
    "addedBy":,
    "title": '测试图片',
    "extension": file.name[-3:]
    }
    serial = TestFileSerializer(data=data)
    if not serial.is_valid():
    return Response(serial.data, status=status.HTTP_400_BAD_REQUEST)
    serial.save()
    return Response(serial.data)
    # 下载图片
    def list(self, request, *args, **kwargs):
    ftp = SSH(host, port, user, password)
    down_file_name = request.GET.get('file_name')# 获取下载文件
    self.serializer_class = TestFileSerializer
    current = ""
    dir_name = ""
    rand_num = random.randint(10, 99)# 生成随机数,防止图片名重复
    file_name = 'test' + current + str(rand_num) + '.jpg'
    ftp.download(file_name, 文件路径)
    image_data = open(file_name, "rb").read()
    os.remove(file_name)
    return HttpResponse(image_data, content_type="image/png")
    最后记得HttpResponse 返回图片数据即可
    附上我的js中的sendfile:
    function sendFile(files) {
    var files_length = files.length;
    var data = new FormData();
    for (var i = 0; i < files_length; i++) {
    data.append("ajaxTaskFile" + [i], files[i]);

    $.ajax({
    data: data,
    type: "POST",
    url: $context1 + "test_save_file?num=" + i,
    cache: false,
    contentType: false,
    processData: false,
    success: function (data) {
    $('#editor').summernote('insertImage', data.pathname);# data,pathname这个参数其实就是summernote的回显函数,get请求。
    },
    error: function () {
    alert("上传失败");
    }
    });
    }
    }
    前面说到的随机文件后缀,其实是给与了图片一个唯一性,因为在提交bug界面,你的bug是没提交的,所以你没法获取bug的id进行关联。而且你需要用户上传或者关联之后,回显图片,所以你也不能在提交bug之后再保存图片。
    上面的方案是上传到服务器之后,数据库中保留的字段就是图片的路径,再把需要下载的图片名传递给我们视图中的get请求,回显之后,保存,bug数据表中,summernote字段保存的是一个img标签和路径,基本满足需求。
  • 相关阅读:
    Android 3.0 r1 API中文文档(108) —— ExpandableListAdapter
    Android 3.0 r1 API中文文档(113) ——SlidingDrawer
    Android 3.0 r1 API中文文档(105) —— ViewParent
    Android 中文 API (102)—— CursorAdapter
    Android开发者指南(4) —— Application Fundamentals
    Android开发者指南(1) —— Android Debug Bridge(adb)
    Android中文API(115)——AudioFormat
    Android中文API(116)——TableLayout
    Android开发者指南(3) —— Other Tools
    Android中文API (110) —— CursorTreeAdapter
  • 原文地址:https://www.cnblogs.com/qinghuaL/p/9416285.html
Copyright © 2011-2022 走看看