使用data:uri上传图片
上传图片的方式有两种,一种是使用传统的html控件的方式,设置form属性为multipart/form-data。这种方式兼容ie6,ie7。另一种方式是使用data:uri,将base64编码从浏览器端post到服务器端,然后利用Base64解码即可。这种方式只是用与比较modern的浏览器,比如ie9,chrome,firefox,safari。本文主要讲讲我们如何利用data:uri的方式上传图片的。
Data URI 格式
data URI的格式非常简单,具体可以看RFC2397,data URI基本的格式如下:
data:[<mime type>][;charset=<charset>][;base64],<encoded data>
在这个格式中,
data:
是URI的协议头,表明其资源是一个data URI。第二部分,MIME type,表示数据呈现的格式,对于PNG的图片,其格式是:image/png,如果没有指定,默认的格式是:text/plain。这个character set(字符集)大多数被忽略,如果指定是的数据格式是图片时,字符集将不再使用;下一部分,将表明其数据的编码方式,我们可以不必使用base64编码格式,如果那样,我们将使用标准的URL编码方式(形如%XX%XX%XX的格式);这个encoded data部分,可能包含空格,但是无关紧要。
Base 64编码
base64是一种编码方式,将数据变成位流(bit stream),然后将其映射到base64的集合内。base64包含A-Z,a-z,自然数以及+,/符号。等号=表明我们需要进行位填充(padding)。
处理代码:
import java.io.FileOutputStream; import java.io.OutputStream; import sun.misc.BASE64Decoder; /** * to convert base64 string to a image * here we use it to handle data:uri * */ public class Base64StringToImage{ public boolean generateImage(String imageStr, String imageFilePath){ if(imageStr == null){ return false; } BASE64Decoder decoder = new BASE64Decoder(); try { // Base64 decode byte[] bytes = decoder.decodeBuffer(imageStr); for (int i = 0; i < bytes.length; ++i) { if (bytes[i] < 0) { bytes[i] += 256; } } // generate image OutputStream out = new FileOutputStream(imageFilePath); out.write(bytes); out.flush(); out.close(); return true; } catch (Exception e) { return false; } } }
使用data:uri上传方式很简单吧。。