ajax实现异步上传图片

简介: 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);
        }
    }

测试结果:
image
虽然简单实现了,但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

目录
相关文章
|
6月前
|
前端开发 JavaScript Java
使用Ajax进行异步交互:提升Java Web应用的用户体验
【4月更文挑战第3天】Ajax技术在Web开发中提升UX,通过与服务器异步交互实现页面局部更新,无需完整刷新。核心组件包括XMLHttpRequest、JavaScript、HTML/CSS及服务器端脚本。在Java Web应用中,可使用原生JavaScript或框架如jQuery、AngularJS实现Ajax请求。Ajax减少页面刷新,实现实时数据更新,即时表单验证和动态UI,显著改善用户体验,是现代Web开发不可或缺的一部分。
85 0
|
6月前
|
前端开发 JavaScript API
Ajax技术的秘密揭秘:异步传输,高效交互
Ajax技术的秘密揭秘:异步传输,高效交互
|
3月前
|
前端开发 JavaScript Java
Ajax进行异步交互:提升Java Web应用的用户体验
Ajax 技术允许在不重载整个页面的情况下与服务器异步交换数据,通过局部更新页面内容,极大提升了 Java Web 应用的响应速度和用户体验。本文介绍 Ajax 的基本原理及其实现方式,包括使用 XMLHttpRequest 对象发送请求、处理响应数据,并在 Java Web 应用中集成 Ajax。此外,还探讨了 Ajax 如何通过减少页面刷新、实时数据更新等功能改善用户体验。
73 3
|
5月前
|
XML 移动开发 前端开发
JS设置Ajax为同步或异步
JS设置Ajax为同步或异步
74 0
|
5月前
1.ajax同步和异步区别 2.post和get区别
1.ajax同步和异步区别 2.post和get区别
31 0
|
6月前
|
XML JSON 前端开发
学习Ajax使用异步对象发送请求
Ajax,全称Asynchronous JavaScript and XML(异步JavaScript和XML),是一种用于创建更好、更快以及交互性更强的Web应用程序的技术。
68 3
|
6月前
|
JSON 前端开发 JavaScript
探秘 AJAX:让网页变得更智能的异步技术(下)
探秘 AJAX:让网页变得更智能的异步技术(下)
探秘 AJAX:让网页变得更智能的异步技术(下)
|
6月前
|
XML 前端开发 JavaScript
探秘 AJAX:让网页变得更智能的异步技术(上)
探秘 AJAX:让网页变得更智能的异步技术(上)
探秘 AJAX:让网页变得更智能的异步技术(上)
|
XML 前端开发 JavaScript
JS案例:ajax获取图片列表
JS案例:ajax获取图片列表
217 0
JS案例:ajax获取图片列表
|
前端开发 JavaScript 关系型数据库
宝塔设置PHP定时任务实战记录(定时任务、ajax异步刷新API、shell脚本、访问url)
宝塔设置PHP定时任务实战记录(定时任务、ajax异步刷新API、shell脚本、访问url)
751 0