Ajax上传文件并显示进度条

2025-10-11 22:03:08

1、第一种:创建一个springboot的项目。

1、 打开创建页面 选择File-new-project..

2、选择创建的项目为spring initializr 进入springboot项目创建步骤(也可以选择类型java,创建一个普通java项目)

3、输入项目名字,选择依赖web(根据项目需求选择,此次需要),选择存放目录-完成(Finish)

4、在pom.xml中引入html以依赖

<dependency>

   <groupId>org.springframework.boot</groupId>

   <artifactId>spring-boot-starter-thymeleaf</artifactId>

</dependency>

Ajax上传文件并显示进度条

Ajax上传文件并显示进度条

Ajax上传文件并显示进度条

Ajax上传文件并显示进度条

Ajax上传文件并显示进度条

Ajax上传文件并显示进度条

2、第二种:创建一个简单的javaweb项目。

1、创建一个基本的javaweb项目

2、集成springmvc开发环境

1、第一步:实现思路。

1、借助于springboot的框架(springboot集成springmvc),实现上传的后天功能。将文件上传到D:\img下

2、前端借助于原生js实现对上传请求的监控获得上传进度,请求完成的情况下

2、第二步:编写controller

import org.springframework.stereotype.Controller;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RequestMethod;

import org.springframework.web.bind.annotation.RequestParam;

import org.springframework.web.bind.annotation.ResponseBody;

import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;

import java.io.File;

import java.io.FileOutputStream;

//访问地址:http://localhost:8080/toAsyn

@Controller

public class UploadController {

// 跳转到上传文件的页面

@RequestMapping(value = "/toAsyn", method = RequestMethod.GET)

public String toAsyn() {

// 跳转到 templates 目录下的 uploadimg.html

return "asyn";

}

// 处理文件上传

@ResponseBody

@RequestMapping(value = "/testuploadimg", method = RequestMethod.POST)

public String uploadImg(@RequestParam("file") MultipartFile file,

HttpServletRequest request) {

String contentType = file.getContentType();

String fileName = file.getOriginalFilename();

String filePath = "d:/img/";

if (file.isEmpty()) {

return "文件为空!";

}

try {

uploadFile(file.getBytes(), filePath, fileName);

} catch (Exception e) {

// TODO: handle exception

}

// 返回json

return "succes";

}

private void uploadFile(byte[] file, String filePath, String fileName)

throws Exception {

File targetFile = new File(filePath);

if (!targetFile.exists()) {

targetFile.mkdirs();

}

FileOutputStream out = new FileOutputStream(filePath + fileName);

out.write(file);

out.flush();

out.close();

}

}

Ajax上传文件并显示进度条

Ajax上传文件并显示进度条

3、第三步:设置文件最大上传限制。

1、新建application.yml

放到前项目下的:src\main\resources\application.yml

2、添加内容:

spring:  

servlet:    

multipart:      

max-file-size: 120MB      

max-request-size: 120MB

3:否则上传文件超过10485760 字节就会报错

the request was rejected because its size (64050422) exceeds the configured maximum (10485760)

Ajax上传文件并显示进度条

4、第四步:编写前端代码。

1、路径在 当前项目的:src\main\resources\asyn.html

<!DOCTYPE html>

<html>

<head>

<meta charset="UTF-8">

<title>上传进度条</title>

</head>

<body>

<div align="center">

<input type="file" id="pic" name="pic"/>

<input type="button" value="上传图片" onclick="uploadFile()" /><br />

</div>

<div id="progressBar" style="padding:0px;border:solid black 0px;visibility:hidden">

<table width="300" border="0" cellspacing="0" cellpadding="0"

  align="center">

<tr>

<td align="center" id="progressPersent">0%</td>

</tr>

<tr>

<td>

<!-- 黑色边框部分 -->

<table width="100%" border="1" cellspacing="0" cellpadding="0"

  bordercolor="#000000">

<tr>

<td>

<!-- 红色部分 -->

<table width="1%" border="0" cellspacing="0" cellpadding="0"

  bgcolor="#FF0000" id="progress">

<tr>

<td>&nbsp;</td>

</tr>

</table>

</td>

</tr>

</table>

</td>

</tr>

<tr>

<td align="center" id="complete">completed</td>

</tr>

</table>

</div>

<script>

    var xhr = new XMLHttpRequest();

    //上传失败

    function uploadFailed(evt) {

        document.getElementById("progressBar").style.visibility="hidden";

        document.getElementById("complete").innerText ="上传异常!" ;

    }

    /**

     * 侦查附件上传情况 ,这个方法大概0.05-0.1秒执行一次

     */

    function onprogress(evt){

        document.getElementById("progressBar").style.visibility="visible";

        var loaded = evt.loaded;       //已经上传大小情况

        var tot = evt.total;       //附件总大小

        var per = Math.floor(100*loaded/tot);   //已经上传的百分比

        //document.getElementById("son").innerHTML =per +"%" ;

        document.getElementById("progressPersent").innerText =per +"%" ;

        document.getElementById("progress").style.width =per +"%" ;

    }

    //上传文件

    function uploadFile() {

        //将上传的多个文件放入formData中

        var picFileList = document.getElementById("pic").files;

        var formData = new FormData();

        formData.append("file" , picFileList[0] );

        //监听事件

        xhr.upload.addEventListener("progress", onprogress, false);

        xhr.addEventListener("error", uploadFailed, false);//发送文件和表单自定义参数

        xhr.open("POST", "testuploadimg",true);

        //记得加入上传数据formData

        xhr.send(formData);

        xhr.onreadystatechange = function() {

            if (xhr.readyState == 4 && xhr.status == 200) {

                if(xhr.responseText == "succes"){

                    document.getElementById("progress").style.width ="100%" ;

                    document.getElementById("progressPersent").innerText ="100%" ;

                    document.getElementById("complete").innerText ="上传成功!" ;

}else{

                    document.getElementById("complete").innerText ="上传失败!" ;

}

            }

}

    }

</script>

</body>

</html>

Ajax上传文件并显示进度条

Ajax上传文件并显示进度条

Ajax上传文件并显示进度条

1、第一步:测试。

1、为了测试上传进度效果此次测试文件大小为61MB

2、启动服务进入:http://localhost:8080/toAsyn

3、选择文件上传,测试成功,如下所示:

Ajax上传文件并显示进度条

Ajax上传文件并显示进度条

Ajax上传文件并显示进度条

Ajax上传文件并显示进度条

2、第二步:总结。

1、非IE一般使用XMLHttpRequest,IE使用ActiveXObject

var xmlHttp = null;

//如果支持XMLHttpRequest则使用

if (XMLHttpRequest) {

xmlHttp = new XMLHttpRequest();

} else {

//如果是IE浏览器则需要使用

xmlHttp = new ActiveXObject('Microsoft.XMLHTTP');

}

2、IE并不支持FormData对象

var formData = new FormData();

3、如果需要兼容ie需要解决以上两个问题

声明:本网站引用、摘录或转载内容仅供网站访问者交流或参考,不代表本站立场,如存在版权或非法内容,请联系站长删除,联系邮箱:site.kefu@qq.com。
猜你喜欢