上传图片的方式有两种,一种是使用传统的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上传方式很简单吧。。