jQuery ajaxForm 提交前替换input file内容

用的ajaxForm来上传图片(根据设定可以传到七牛或者自己的服务器),这块的功能是正常的,并且已经在生产上使用了。
现在考虑到用户直接上传的图片太大了,所以想先处理一下,处理图片现在用了localResizeIMG3,已经能够得到处理之后的图片base64编码。

现在的问题是怎么将图片的base64去替换之前form里面input file的值,如果能够直接替换的话就完全能够沿用现在的接口(尤其是七牛那边,没法改服务端),工作量也会小一些。

简化一下,其实这个问题就是怎么自己替换掉form原本要提交的input file的文件内容。

阅读 4.4k
2 个回答

localResizeIMG 处理后给了一堆东西,其中有FormData也有File,你再包一下就能用了。或者如果七牛对数据包格式有要求的话(并没用过),你自己new一个FormData传了就行。
之前做过对接阿里云OSS的,你参考吧。

现在招到一个方案,在submit之前,替换里面的参数,用下面的代码把base64的数据转换成Blob,在new File得到文件,替换提交参数里面的file值。有个缺陷是Safari和IE上不能new File,无解~~~

function dataURItoBlob(dataURI) {
  // convert base64 to raw binary data held in a string
  // doesn't handle URLEncoded DataURIs - see SO answer #6850276 for code that does this
  var byteString = atob(dataURI.split(',')[1]);

  // separate out the mime component
  var mimeString = dataURI.split(',')[0].split(':')[1].split(';')[0]

  // write the bytes of the string to an ArrayBuffer
  var ab = new ArrayBuffer(byteString.length);
  var ia = new Uint8Array(ab);
  for (var i = 0; i < byteString.length; i++) {
      ia[i] = byteString.charCodeAt(i);
  }

  // write the ArrayBuffer to a blob, and you're done
  var blob = new Blob([ab], {type: mimeString});
  return blob;

  // Old code
  // var bb = new BlobBuilder();
  // bb.append(ab);
  // return bb.getBlob(mimeString);
}

Creating a Blob from a base64 string in JavaScript

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进