H5下的ajax上传图片,tomcat服务器

最近做微信端开发,需要做到的是跟AndroidiOS一样的多图上传功能,选完图片后,马上可以预览,然后点击上传可以将所有图片包含文字数据传递到后台服务器。

遇到的坑:图片太大的时候(超过2M),后台接到数据都为null,包括文字数据。 经过一番研究顺利解决这个坑。

解决方法:

1:如果想按照原图发送,并且以ajax去传,那么务必修改tomcat服务器的配置文件,取消post数据的限制,默认是限制2M。

<Connector port="8081"    
               maxThreads="150" minSpareThreads="25" maxSpareThreads="75"    
               enableLookups="false" redirectPort="8443" acceptCount="100"    
               debug="0" connectionTimeout="20000"     
               disableUploadTimeout="true" URIEncoding="GBK"    
               maxPostSize="0"/>                    //maxPostSize="0"表示post数据无限制

2:压缩图片:这也是我采取的方式:现在手机一张图片最少3M以上,所以压缩图片成为一种必须

前端方面:

 <div class="weui-uploader__bd">
          <ul class="weui-uploader__files" id="uploaderFiles">
          </ul>
             <input type="file" id="file" accept="image/*;" capture="camera" >
 </div>
JS:

图片压缩和追加到控件中**/     
document.getElementById('file').addEventListener('change', function() {  
    var reader = new FileReader();  
    reader.onload = function (e) {  
        compress(this.result);  
    };  
    reader.readAsDataURL(this.files[0]);  
  
}, false);  
  
  
var compress = function (res) {  
     var img = new Image(),  
        maxH = 750;  
        img.src=res;  
    img.onload = function () {  
        var cvs = document.createElement('canvas'),  
            ctx = cvs.getContext('2d');  
  
        if(img.height > maxH) {  
            img.width *= maxH / img.height;  
            img.height = maxH;  
        }  
  
        cvs.width = img.width;  
        cvs.height = img.height;  
  
        ctx.clearRect(0, 0, cvs.width, cvs.height);  
        ctx.drawImage(img, 0, 0, img.width, img.height);  
  
        var dataUrl = cvs.toDataURL('image/jpeg', 0.9);                              //dataUrl就是base64位编码的数据  
$("#uploaderFiles").append("<li><img class='weui-uploader__file'  src='"+dataUrl+"'></li>");   
    }   
}
上传的时候将所有的图片数据的base64编码用特定格式拼接起来(长字符串)

组装图片的base64位编码*/  
function putimg()  
{  
var arr=$("img");  
if(""===phoneImg)  
{  
for(var i=0;i<arr.length;i++)  
{  
phoneImg=phoneImg+arr[i].src+";..;";                             //phoneImg就是所有的图片数据  
}  
}  
}
然后是ajax上传了:
 $.ajax({
            type: 'post',
            url: '${pageContext.request.contextPath}/WOaWork/save.do',    //指明传递到底动作位置
            dataType: 'json',               //数据类型,
            data: obj,     //这就是传给面动作的参数
            success: function (data) {      //传递成功则执行这个函数
			if(data.state=="success"){
			 $.toptip('提交成功', 'success');
				history.back(-1);
			}
				else{
				$.toptip('出现错误', 'success'); 
			}
	}
	}); 

后端的核心代码是:拿到图片的字符串后,对字符串进行切割,成为图片数组。然后将图片数据解密成图片:
  *   
     *author:cwy  
     *说明:  
     *参数:  
     * @param imgStr-------网页传递过来的图片base64编码一般都会在真正的图片数据前面带上:data:image/png;base64  类似这样的格式  
     * @return  
     */  
    public static String getImgStr(String imgStr)  
    {  
        String img="";  
        if(imgStr.indexOf("data:image/png;base64")!=-1)  
        {  
            img=imgStr.substring("data:image/png;base64".length()+1);  
        }  
        if(imgStr.indexOf("data:image/jpeg;base64")!=-1)  
        {  
            img=imgStr.substring("data:image/jpeg;base64".length()+1);  
        }  
        return img;  
    }

 *   
     *author:cwy  
     *说明:  
     *参数:  
     * @param imgStr  ----base64位图片编码  
     * @param path    ----图片路径  
     * @return  
     */  
    public static boolean generateImage(String imgStr, String path) {  
        imgStr=getImgStr(imgStr);  
        if (StringUtils.isEmpty(imgStr))  
        {  
        return false;  
        }  
        OutputStream out=null;  
        try {  
        BASE64Decoder decoder = new BASE64Decoder();  
        // 解密  
        byte[] b= decoder.decodeBuffer(imgStr);  
        // 处理数据  
        for (int i = 0; i < b.length; ++i) {  
            if (b[i] < 0) {  
            b[i] += 256;  
            }  
        }  
        out = new FileOutputStream(path);  
        out.write(b);  
        out.flush();  
        out.close();  
        }  
        catch (IOException e) {  
            return false;  
        }  
        return true;  
    }  
至此:功能完毕。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
首先,需要在前端实现上图片功能,可以使用HTML5的File API和XMLHttpRequest对象来实现。代码如下: ``` <input type="file" id="fileInput"> <button onclick="upload()">上</button> <script> function upload() { var fileInput = document.getElementById('fileInput'); var file = fileInput.files[0]; var formData = new FormData(); formData.append('file', file); var xhr = new XMLHttpRequest(); xhr.open('POST', '/upload'); xhr.onload = function () { if (xhr.status === 200) { console.log('上成功'); } }; xhr.send(formData); } </script> ``` 其中,fileInput获取了input标签中type为file的元素,formData新建了一个FormData对象并将要上的文件添加到formData中,xhr则是新建的XMLHttpRequest对象,open方法指定了上文件的接口地址,onload方法用于处理上成功后的逻辑。在此之前,需要确保服务器端的/upload接口已经实现。 接下来,需要在服务器端处理接收到的文件。一个常见的解决方案是使用multer模块。安装multer之后,可以如下使用: ``` const multer = require('multer'); const upload = multer({ dest: 'uploads/' }); router.post('/upload', upload.single('file'), function (req, res, next) { console.log(req.file); res.send('上成功'); }); ``` 其中,multer返回的是一个处理上的中间件,可以将上的文件存储到指定的目录下(此处为'uploads/'),single方法则表示处理单个文件,将上表单中的file属性作为参数。上成功后,可以在控制台中看到req.file,其包含了文件的元数据和存储路径等信息。 以上便是H5手机上图片服务器的源码实现,需要注意的是,上述代码仅为示例代码,具体的实现方式需要根据项目的需求来设计和实现。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值