Html5拍照上传图片到servlet

今天记录下,html5图片canvas压缩后上传,上传时的数据是formdata中的Blob封装数据,然后到servlet中将图片读取出来。

技术点:1、canvas画板压缩图片。(这个网上很多代码,我这里压缩效果不好,2M的图片压缩后还有1M)。

2、上传数据。这里是通过 XMLHttpRequest()上传的,也可以用Ajax上传。数据最终传的时Blob数据。

3、后台servlet读取文件。

遇到的坑、坑坑:1、canvas压缩网上很多,眼花缭乱,开始时候,抄完不知道最好数据在哪。

2、上传是用base64直接上传还是用form表单上传,还是用Ajax异步上传。

3、后台Servlet,读取文件,根据第二坑,一直在网上找过各种写法。

    a、base64获取转码最后生产图片;此坑坑了我很久,获取到了base64字符串,生产不了图片。没解决,换方法了。

   b、form上传,简单,上传的原始文件,没有压缩,不知道压缩后的图片怎么通过form表单上传,试了很多次,都是源文件,没压缩。

  c、 XMLHttpRequest()上传的Blob数据。这个也是,我一直不知道怎么获取Blob数据,我都不知道传过去的是什么。这里写下,最后传过去的数据格式:

{name = blob ......... isFormField =false FieldName=imageFile}

不知道 name 和 filedName怎么生成的,我前端Ajax ,jqury知识太少。
下面上代码:
···<body onload="init();">

<div class="hintStr">
<h1>******</h1>
</div>

<div class="imgBox">
<img id="originimage" src="<%=path %>/img/temp.png" alt=""/>
</div>

<div class="menuBox clear">
<a id="photo" href="#">拍照
<input id="fileCamera" type="file" onchange="selectImage(this);" accept="image/*" capture="camera"/>
</a>
<input id="sendButton" type="button" onclick="uploadImage();" value="发送" />
</div>

<canvas id="compress"></canvas>
<div id=result ></div>

</body>
<script>
// 初始化
function init() {
var fileCamera = document.getElementById('fileCamera');
fileCamera.onchange = function () {
var fileList = fileCamera.files;
var file = fileList[0];
var reader = new FileReader();
reader.readAsDataURL(file);
reader.onload = function (evt) {
// 显示用户拍照图片
document.getElementById('originimage').src = evt.target.result;
// 图片载入画布
showCanvas(evt.target.result);
}
// 发送按键显示
document.getElementById('sendButton').style.display = 'inline';
}
}

// 压缩处理
function showCanvas(dataUrl) {
    var img = new Image();
    img.src = dataUrl;
    img.onload = function () {
        var canvasCompress = document.getElementById('compress');
        var ctx = canvasCompress.getContext('2d');
        var width = img.width , height = img.height;
        var scal = width/height;
        alert(scal);
        canvasCompress.width = 700; //这里设置了压缩后图片的宽
        canvasCompress.height =700/scal;    
        alert(canvasCompress.height);
        // 图片压缩比例(长,宽)
        ctx.scale(1, 1);
        ctx.drawImage(img, 0, 0,width,height,0,0, canvasCompress.width, canvasCompress.height);
    }
}
// 图片上传
function uploadImage(){
    var canvasCompress = document.getElementById('compress');
    var data = canvasCompress.toDataURL("image/jpg",0.01);
    var formData = new FormData();
    console.log("成功创建对象:"+formData);
    formData.append("imageFile", convertBase64UrlToBlob(data));
    var xhr= new XMLHttpRequest();
    xhr.open('POST', 'ImageServlet');
    xhr.onreadystatechange = function(){
        if (xhr.readyState== 4&& xhr.status== 200){
            console.log('上传成功'+xhr.responseText);
            $("#result").append("<p>"+xhr.responseText+"</p>");
        }
    };
    xhr.send(formData);
}
// 数据打包
function convertBase64UrlToBlob(urlData){
    var bytes = window.atob(urlData.split(',')[1]);
    var ab = new ArrayBuffer(bytes.length);
    var ia = new Uint8Array(ab);
        for (var i = 0; i < bytes.length; i++) {
        ia[i] = bytes.charCodeAt(i);
        }
    return new Blob( [ab] , {type : 'image/jpg'});
}

</script>

servlet代码:
···protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// TODO Auto-generated method stub
// this.doGet(request, response);
request.setCharacterEncoding("utf-8");// 设置编码
response.setContentType("text/html;charset=UTF-8");
response.setCharacterEncoding("utf-8");
PrintWriter out = response.getWriter();
DiskFileItemFactory factory = new DiskFileItemFactory();// 获取磁盘文件条目工厂
// 设置文件上传路径
String uploadPath = this.getServletContext().getRealPath("/") + "photo";
// System.out.println(uploadPath);
File file = new File(uploadPath);
if (!file.exists()) {
file.mkdirs();
}
// 获取系统默认的临时文件保存路径,该路径为Tomcat根目录下的temp文件夹
String temp = System.getProperty("java.io.tmpdir");
// 设置临时文件夹为temp
factory.setRepository(new File(temp));
factory.setSizeThreshold(1024 * 1024 * 5);// 设置缓存大小为5M
// 用工厂实例化上传组件,ServletFileUpload用来解析文件上传请求
ServletFileUpload upload = new ServletFileUpload(factory);
try {
List<FileItem> items = upload.parseRequest(request);
Map param = new HashMap();
for (Object object : items) {
FileItem fileItem = (FileItem) object;
if (fileItem.isFormField()) {
param.put(fileItem.getFieldName(), fileItem.getString("utf-8"));// 如果你页面编码是utf-8的
} else {
String imgName = UUID.randomUUID().toString().replace("-", "") + ".jpg";// 生成名字
if (isOSLinux()) {
path = uploadPath + "/" + imgName;
}else {
path = uploadPath + "\" + imgName;}
System.out.println("=======================" + path + "==========");
InputStream is = fileItem.getInputStream();
inputStream2File(is, path);
Thread.sleep(10000);
File imgFile = new File(path);
if (imgFile.exists()) {
HttpRequest hRequest = new HttpRequest();
String result = hRequest.sendGet(url, path);
out.print(result.toString());
}
}
}
} catch (FileUploadException e) {
response.getWriter().println("图片上传失败:" + e.getMessage());
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
System.out.println("图片写入磁盘失败!");
response.getWriter().println("图片写入磁盘失败:" + e.getMessage());
}
out.flush();
out.close();
// response.getWriter().append("Served at:
// ").append(request.getContextPath()+"/photo");
}

// 流转化成字符串
public static String inputStream2String(InputStream is) throws IOException {
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    int i = -1;
    while ((i = is.read()) != -1) {
        baos.write(i);
    }
    return baos.toString();
}

// 流转化成文件
public static void inputStream2File(InputStream is, String savePath) throws Exception {
    System.out.println("文件保存路径为:" + savePath);
    File file = new File(savePath);
    InputStream inputSteam = is;
    BufferedInputStream fis = new BufferedInputStream(inputSteam);
    FileOutputStream fos = new FileOutputStream(file);
    int f;
    while ((f = fis.read()) != -1) {
        fos.write(f);
    }
    fos.flush();
    fos.close();
    fis.close();
    inputSteam.close();

}

// 判断系统是否是Linux,如果是需要修改“\”,为“/"
public static boolean isOSLinux() {
    Properties prop = System.getProperties();
    String os = prop.getProperty("os.name");
    if (os != null && os.toLowerCase().indexOf("linux") > -1) {
        return true;
    } else {
        return false;
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,826评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,968评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,234评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,562评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,611评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,482评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,271评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,166评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,608评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,814评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,926评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,644评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,249评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,866评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,991评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,063评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,871评论 2 354

推荐阅读更多精彩内容

  • 前端开发面试题 <a name='preface'>前言</a> 只看问题点这里 看全部问题和答案点这里 本文由我...
    自you是敏感词阅读 760评论 0 3
  • 前端与后端的数据交互 前端与后端的数据交互,最常用的就是GET、POST,比较常用的用法是:提交表单数据到后端,后...
    程序员咕咕信阅读 79评论 0 0
  • 缺少经验的程序员往往可能想到自己去写个工具类来处理,这个想法当然是没有错的,但我们应尽可能去利用那些成熟的第三方库...
    Albert陈凯阅读 820评论 0 3
  • 我已婷婷,无忧亦无惧。 我从地狱来,要到天堂去,正路过人间。 人面不知何处去,桃花是你,春风也是你。 因为你给的嬉...
    妖孽大魔王阅读 227评论 0 0
  • 今晚 有朋友问我 加入肥羊成长营 我最大的改变什么? 每每别人问我这个问题 我都要思考一小会儿 但其实答案都一样 ...
    马田心Martinc手作阅读 247评论 2 1