项目回顾1-图片上传-form表单还是base64-前端图片压缩

第一个项目终于上线了,是一个叫亲青筹的公益众筹平台,微信端,电脑端还有后台界面大部分都是我完成的,几个月过来,感觉收获了很多,觉得要总结一下。

首先想到的是图片上传的问题。在通常表单数据都是ajax上传的情况下,为了上传图片而去使用form表单感觉很蠢。然后那时候也没有想到用jquery form插件。

后台的同事给的方案是用iframe里写一个form表单,然后上传图片之后自动提交表单,他将图片在服务器上的地址以跳转页url的一部分,我再来截取的方式。

方案一:iframe+form表单

    <form action="/user/uploadIdCard.do" class="fileForm picUpload" enctype="multipart/form-data" method="post">
        <input type="file" id="uploadPic" name="file">
        <label for="uploadPic" id="fileBtn">
            +
            <img src="" />
        </label>
        <input type="text" name="turnUrl" class="turnUrl">
    </form>
    $(".turnUrl").val(window.location.pathname);
    $("#uploadPic").on(‘change‘, function(event) {
        event.preventDefault();
        $("form").submit();
    });

在需要上传图片的界面引入iframe,在调用公用库里的iframe方法,获得图片的url并且把图片显示在iframe中

// 提取iframe里的路径
function iframe(el) {
    var baseurl = "";
    var code, filePath;
    var place = $(el)[0].contentWindow.location.search;
    console.log(place);
    if (place) {
        code = place.match(/code=\d+/)[0].substr(5);
        if (place.match(/filepath=\S+/)) {
            filePath = place.match(/filepath=\S+/)[0].substr(9);
        }
        $(el).contents().find(".tip").css(‘color‘, ‘#d0021b‘);
        console.log(filePath);
        switch (code) {
            case "200":
                $(el).contents().find(".tip").text(‘上传成功‘);
                $(el).contents().find(".tip").css(‘color‘, ‘#55a012‘);
                $(el).contents().find("#fileBtn>img").show().attr("src", baseurl + "/" + filePath);
                return "/" + filePath;
            case "206":
                $(el).contents().find(".tip").text(‘文件过大‘);
                break;
            case "207":
                $(el).contents().find(".tip").text(‘文件类型错误‘);
                break;
            case "208":
                $(el).contents().find(".tip").text(‘系统错误‘);
        }
    }
}

方案二:后来发现这样的做法有两个问题,一个是用户发的图片太大,后台没有做压缩(后台的同事太忙了,为了迁就他们,就我们前端做压缩了)。第二个是,上传图片成功之后,图片显示在iframe上,这样需要一定的反应时间,使用者有时候会反映图片传不上去,其实只是后台还没有返回……

于是决定用base64上传到后台的方式

    <input type="file" id="uploadPic" name="file">
    <label for="uploadPic" id="fileBtn">
        +
        <img class="showPic" src="" />
    </label>
    <span class="tip">请上传图片,大小在2M以内<br/>(图片类型可为jpg,jepg,png,gif,bmp)<br/>推荐图片比例为640*400</span>
    <input type="text" name="turnUrl" class="turnUrl">
    <canvas id="uploadImg" style="display:none"></canvas>

结构和原来差不多,只是多了一个canvas

    $("#uploadPic").on(‘change‘, function(event) {
        event.preventDefault();
        console.log($(this)[0].files);
        var file = $(this)[0].files[0];
        if(file.size>2097152){
            alert("上传图片请小于2M");
            return false;
        }        if (!/image\/\w+/.test(file.type)) {
            alert("文件必须为图片!");
            return false;
        }
        var reader = new FileReader();
        reader.readAsDataURL(file);
        reader.onload = function(e) {
                createCanvas(this.result);
            }
    });

    function createCanvas(src) {
        var canvas = document.getElementById("uploadImg");
        var cxt = canvas.getContext(‘2d‘);
        canvas.width = 640;
        canvas.height = 400;
        var img = new Image();
        img.src = src;
        img.onload = function() {
            // var w=img.width;
            // var h=img.height;
            // canvas.width= w;
            // canvas.height=h;
            cxt.drawImage(img, 0, 0,640,400);
            //cxt.drawImage(img, 0, 0);
            $(".showPic").show().attr(‘src‘, canvas.toDataURL("image/jpeg", 0.9));
            $.ajax({
                url: "/front/uploadByBase64.do",
                type: "POST",
                data: {
                    "imgStr": canvas.toDataURL("image/jpeg", 0.9).split(‘,‘)[1]
                },
                success: function(data) {
                    console.log(data);
                    $(".showPic").show().attr(‘data-url‘,"/"+ data.url);
                }
            });
        }
    }

1.首先是用的input的file文件的信息,判断文件大小file.size,以及文件是否为图片file.type

2.再通过html5的FileReader接口来获得这个图片的base64数据

3.将这个base64传入canvas中,作为一张图的src,这时候可以设置图片的分辨率大小,保证上传的图都是统一的分辨率。当然也可以按照图片原来的大小。

4.在ajax之前,把处理后的base64直接显示出来(这样用户就可以立刻看到自己上传的图片),再将 canvas.toDataURL("image/jpeg", 0.9).split(‘,‘)[1] (类型为image/jpeg,就可以用第二个参数来设置画质了)传到后台对应的接口

5.再将后台返回的url 绑在图片的data-url属性上,在ajax上交整个表单时获取这个data-url就好了,这样用户可以最快时间看到,而url其实还在ajax到后台的过程中

后记:这两个方案都有一个问题,会给后台上传很多冗余图片。不过后台的同事貌似没什么意见,囧。

实际效果是这样的 http://www.qqchou.org/qqcweb/pages/photoIframe.html

时间: 2024-08-26 12:42:28

项目回顾1-图片上传-form表单还是base64-前端图片压缩的相关文章

基于Http原理实现Android的图片上传和表单提交

版权声明:本文由张坤  原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/794875001483009140 来源:腾云阁 https://www.qcloud.com/community 现在服务器主要是Web居多,客户端一般通过http上传文件到web服务器,最开始的设想很简单,直接将图片转化为字节流,写入到http的outstream,随后发送出去即可. 但当这种方法出现问题,服务器根据文件名这个表单中的字段来判定

记一种有图片上传的表单提交

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>动态加载下拉框中的类别_文件上传_添加商品</title

springmvc文件上传及表单数据封装

补充: form表单需要提交时间,springmvc封装到实体类的Date字段时,丢失时分秒,可以在controller中添加     @InitBinder     public void initBinder(WebDataBinder binder) {         SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");         dateFormat.setLenient(f

kindeditor扩展粘贴图片功能&amp;修改图片上传路径并通过webapi上传图片到图片服务器

前言 kindeditor是一个非常好用的富文本编辑器,它的简单使用我就不再介绍了. 而kindeditor却对图片的处理不够理想. 本篇博文需要解决的问题有两个: kindeditor扩展粘贴图片功能 kindeditor修改图片上传路径并通过webapi上传图片到图片服务器(支持分布式图片) 结果演示 1.扩展粘贴图片功能演示 2.修改图片上传路径演示: 我们的网站演示地址是:http://localhost:9393/ 我们的图片服务器地址是:http://localhost:9394/

上传文件表单格式

示例1: 表单里有图片/文件的上传 <form enctype="multipart/form-data" method="post"> <input type="file" name="uploadfile"/> </form> multipart/form-data 是上传二进制数据 form里面的input的值以2进制的方式传过去,所以这里要明白,使用这种格式以后,后台request就

Java Servlet图片上传至指定文件夹并显示图片

在学习Servlet过程中,针对图片上传做了一个Demo,实现的功能是:在a页面上传图片,点击提交后,将图片保存到服务器指定路径(D:/image):跳转到b页面,b页面读取展示绝对路径(D:/image)的图片.主要步骤如下: 步骤一:上传页面uploadphoto.jsp 需要注意两个问题: 1.form 的method必须是post的,get不能上传文件, 还需要加上enctype="multipart/form-data" 表示提交的数据是二进制文件. 2.需要提供type=&

文件的上传(表单上传和ajax文件异步上传)

一.表单上传: html客户端部分: <form action="upload.ashx" method="post" enctype="multipart/form-data"> 选择文件:<input type="file" name="file1" /><br /> <input type="submit" value="上传&q

ASP.NET图片上传,加水印文字和水印图片!

看了清清月儿的这篇文章让自己受益匪浅,但是觉得还有一些问题.上传图片后还有原来的图片文件存在,觉得这样很不爽,调用file类的delete方法删除原来没有生成水印的图片另外自己又加了一个限制图片大小的函数 1.最简单的单文件上传(没花头) 效果图:说明:这是最基本的文件上传,在asp.net1.x中没有这个FileUpload控件,只有html的上传控件,那时候要把html控件转化为服务器控件,很不好用.其实所有文件上传的美丽效果都是从这个FileUpload控件衍生,第一个例子虽然简单却是根本

微信公众平台新增图文内容中图片上传接口,并过滤外链图片(这是封闭么?)

为了加快图文内容的浏览速度,公众平台新增了图文消息内容中的图片上传接口.开发者可以通过该接口上传所需要的图片来获得图片链接,再把图片链接放到图文内容中. 同时,为了加强平台安全性,从8月15日起, 系统将自动过滤图文内容中的外链图片(8月15日之前的图文内容不会过滤).下述接口受到影响,请开发者尽快修改: 1.群发图文消息时,上传图文的接口,查看接口文档 2.素材管理中的新增永久图文素材接口,查看接口文档