ajax实现异步上传图片

图片上传并回显是一个最基本的功能,本文只简单实现了一个demo,并没有进行复杂的判断,简单记录下操作流程:
js中用到了Formdata:FormData对象用以将数据编译成键值对,以便用XMLHttpRequest来发送数据。其主要用于发送表单数据,但亦可用于发送带键数据(keyed data)。如果表单enctype属性设为multipart/form-data ,可以用 new formdata对象来模拟submit()方法来发送数据。
前端代码实现:

<img width="100" height="100" id="ImgUrl"/>
<form id="formTag" enctype="multipart/form-data">
    <div class="uploadImgBtn" id="uploadImgBtn">
        <input class="uploadImg" type="file" name="file" id="tpfile">
    </div>
</form>

css样式:

<style>
        .uploadImgBtn {
            width: 100px;
            height: 100px;
            cursor: pointer;
            position: relative;
            background: url("img/add.gif") no-repeat;
            -webkit-background-size: cover;
            background-size: cover;
        }
        .uploadImgBtn .uploadImg {
            position: absolute;
            right: 0;
            top: 0;
            width: 100%;
            height: 100%;
            opacity: 0;
            cursor: pointer;
        } 
    </style>

ajax代码实现:

<script>
        $(document).ready(function(){
            $("#tpfile").on("change", upload );
        })
        function upload(){

            var self = this;
            $.ajax({
                url: "/upload/uploadPic.do",
                type: "post",
                dataType: "json",
                cache: false,
                data: new FormData($("#formTag")[0]),
                processData: false,// 不处理数据
                contentType: false, // 不设置内容类型
                success: function(data){
                   $("#ImgUrl").attr("src", data.path);
                   /*
                   图片显示路径出错,没解决:反斜杠转义
                   $(self).parent().css({
                        "background-image": "url("+data.path+")"
                    })*/;
                }
            })
        }
 </script>

后台代码实现:


@RequestMapping("/upload/uploadPic.do")
    public void uploadPic(MultipartFile file, HttpServletRequest request, HttpServletResponse response) throws IllegalStateException, IOException {
        try {
            // 获取图片原始文件名
            String originalFilename = file.getOriginalFilename();
            // 文件名使用当前时间
            String name = new SimpleDateFormat("yyyyMMddHHmmssSSS").format(new Date());            
            // 图片上传的相对路径(因为相对路径放到页面上就可以显示图片)
            String path = File.separator+"img"+File.separator + name + "_" +originalFilename ;
            System.out.println(path);
            // 图片上传的绝对路径
            String url = request.getSession().getServletContext().getRealPath("") + path;
            File dir = new File(url);
            if(!dir.exists()) {
                dir.mkdirs();
            }
            // 上传图片
            file.transferTo(new File(url));
            // 将相对路径写回(json格式)
            JSONObject jsonObject = new JSONObject();
            jsonObject.put("path",path);
            // 设置响应数据的类型json
            response.setContentType("application/json; charset=utf-8");
            response.getWriter().write(jsonObject.toString());
        } catch (Exception e) {
            //throw new RuntimeException("服务器繁忙,上传图片失败");
            throw new RuntimeException(e);
        }
    }

测试结果:
ajax实现异步上传图片
虽然简单实现了,但json格式转义出错,还没有解决。

=========================华丽的分割线===========================
实现多文件同时上传
文件上传有很多的注意细节:
1、为保证服务器安全,上传文件应该放在外界无法直接访问的目录下,比如放于WEB-INF目录下。
2、为防止文件覆盖的现象发生,要为上传文件产生一个唯一的文件名。
3、为防止一个目录下面出现太多文件,要使用hash算法打散存储。
4、要限制上传文件的最大值。
5、要限制上传文件的类型,在收到上传文件名时,判断后缀名是否合法。
前端实现:

springmvc 多文件上传
<form action="/upload/uploadMulFile.do" enctype="multipart/form-data" method="post" >
    上传文件1:<input type="file" name="files"><br/>
    上传文件2:<input type="file" name="files"><br/>
    <input type="submit" value="提交"/>
</form>

后端代码实现:


   /**
     * 多文件上传
     * @param request
     */
    @RequestMapping("/upload/uploadMulFile.do")
    public String uploadMulFile(@RequestParam("files") MultipartFile []multipartFiles, HttpServletRequest request){

        String path = File.separator+"upload"+File.separator ;
        String realPath = request.getSession().getServletContext().getRealPath("") + path;

        File dir = new File(realPath);
        if(!dir.exists()) {
            dir.mkdirs();
        }

        if(multipartFiles == null || multipartFiles.length == 0){
            return null;
        }
        if(multipartFiles.length>0){
            for (MultipartFile file :multipartFiles){
                try {

                    file.transferTo(new File(realPath + file.getOriginalFilename()));
                } catch (Exception e) {
                    throw new RuntimeException(e);
                }
            }
        }
        return "tp";
    }

上传下载文件详细参考博客3.

参考:
1.https://www.cnblogs.com/kongxc/p/7831837.html
2.https://www.jianshu.com/p/18206a94fee5
3.https://www.cnblogs.com/xdp-gacl/p/4200090.html

上一篇:JAVA多线程之CountDownLatch


下一篇:C++语言之析构函数与构造函数