buaazp / zimg

A lightweight and high performance image storage and processing system.
http://zimg.buaa.us
BSD 3-Clause "New" or "Revised" License
2.69k stars 401 forks source link

上传的图片能是blob么 #176

Closed lvhh0 closed 7 years ago

lvhh0 commented 7 years ago

php接收的参数为blob(HTMLCanvasElement.toBlob())对象: {"name":"blob","type":"image\/png","tmp_name":"H:\xampp\tmp\phpDFEB.tmp","error":0,"size":244001}

返回HTML:

Upload Result

File: blob

File type is not supported!

Upload Failed!

图片的blob对象是我用js截取的一部分图片。

结论:应该是不支持blob的图片

lvhh0 commented 7 years ago

返回HTML:

Upload Result

File: blob

File type is not supported!

Upload Failed!

buaazp commented 7 years ago

你说的太乱不清除啥意思,如果返回File type is not supported!就是说你传的不是图片或者不支持的格式。

lvhh0 commented 7 years ago

@buaazp 是我传的不是图片的原因,我传的是一个图片的blob对象,所以会报File type is not supported!这个错。

buaazp commented 7 years ago

图片的blob对象是指?看图你应该用的是multipart/form提交的

lvhh0 commented 7 years ago

@buaazp 用户上传头像的时候我用copperjs让用户截取部分图片,截取后的图片得到一个blob对象,然后用ajax提交到服务器上传图片。 js代码:

// Upload cropped image to server if the browser supports `HTMLCanvasElement.toBlob`
cropper.getCroppedCanvas().toBlob(function (blob) {
  var formData = new FormData();
  formData.append('croppedImage', blob);
  // Use `jQuery.ajax` method
  $.ajax('/path/to/upload', {
    method: "POST",
    data: formData,
    processData: false,
    contentType: false,
    success: function () {
      console.log('Upload success');
    },
    error: function () {
      console.log('Upload error');
    }
  });
});
buaazp commented 7 years ago

你这样构造的form表单没有Content-Type,也没有文件名,所以zimg无法判断你上传的东西是什么类型。 建议这种拿到blob的数据走raw-post方式上传而不是表单形式。 如果一定要发表单请求,你需要把相关的字段(filename=xxx.xx)不全,不然没法判断数据类型。

multipart检查文件类型是否合法的代码在这儿: https://github.com/buaazp/zimg/blob/master/src/zhttpd.c#L428

lvhh0 commented 7 years ago

@buaazp OK,我明白了。