zmister2016 / MrDoc

mrdoc,online document system developed based on python. It is suitable for individuals and small teams to manage documents, wiki, knowledge and notes. 觅思文档,适合于个人和中小型团队的在线文档、知识库系统。
https://mrdoc.pro/
GNU General Public License v3.0
2.94k stars 549 forks source link

修复上传图片API的bug #109

Closed GuojieLin closed 3 years ago

GuojieLin commented 3 years ago

目前使用API上传图片,图片无法打开。 图片

查看目录发现图片大小为0

图片

提交的url: http://127.0.0.1:8009/api/upload_img/?token=ad8a78e68deca70891b2b9f9a6ae0d91a5db8414a59fece535b43fbc 提交的数据:{"data":"image/png;base64,图片base64"}

检查代码发现,通过表单的方式读取base64_img = request.POST.get('data','') 实际这样获取不到的。需要从body读取后json解码。改为:base64_img = json.loads(request.body.decode("ascii"))['data']就可以获取到了。

另外优化:

  1. 原来写死png格式,现在从image/png里面解析文件后缀。
  2. 原来图片文件名精确到秒,容易造成批量上传图片时,名称重复,改为精确到微秒。
zmister2016 commented 3 years ago

@GuojieLin 图片上传不成功是你的使用问题,Chrome浏览器扩展一直使用这个接口上传图片都是正常的。这一块代码我将回退。

GuojieLin commented 3 years ago

是提交的数据有问题吗?根据接口文档按照json格式提交的。 使用表单方式提交是可以获取到的,但是会存在+转义为空格的问题

zmister2016 commented 3 years ago

@GuojieLin 可参考Chrome扩展代码

https://gitee.com/zmister/mrdoc-webclipper/blob/master/js/popup.js

//粘贴上传图片
$("#notecontentwrap").on('paste',function(ev){
    var data = ev.clipboardData;
    var items = (event.clipboardData || event.originalEvent.clipboardData).items;
    for (var index in items) {
        var item = items[index];
        if (item.kind === 'file') {
            layer.load(1);
            var blob = item.getAsFile();
            var reader = new FileReader();
            reader.onload = function (event) {
                var base64 = event.target.result;
                //发送请求到background
                chrome.runtime.sendMessage({
                    name: 'pasteimage',
                    data: base64
                });
            }; // data url!
            var url = reader.readAsDataURL(blob);
        }
    }
});

https://gitee.com/zmister/mrdoc-webclipper/blob/master/js/background.js

// 粘贴上传图片
pasteImg = function(data,callback){
    //console.log(data)
    $.post(self.url+'/api/upload_img/?token='+self.token,{data:data}, function (ret) {
        if (ret.success === 1) {
            //新一行的图片显示
            console.log("上传图片成功")
            //console.log(ret.url)
            callback(ret.url)
            notifyTipsSucce("图片上传成功")
        }else{
            console.log("上传图片失败")
            notifyTipsFail("图片上传失败!")
        }
    });
};