文件上传带进度条

1、导入效果

2、进度条HTML代码,需要引用boostrap相关的样式文件 

<div id="pross" class="progress" style="width:400px;margin-top:10px;display:none;">
    <div class="progress-bar progress-bar-striped active" role="progressbar" aria-valuenow="0" aria-valuemin="0" aria-valuemax="100" style="width: 0%">
        0%
    </div>
</div>
<div id="div_import_result" style="display:none;color:red;word-break:break-all;width:400px;">
</div>

3、 JS 代码

this.resultProgress = function (loaded, total) {
    var percent = loaded / total * 100;
    var percentStr = String(percent);
    if (percentStr == "100") {
        percentStr = "100.0";
    }
    percentStr = percentStr.substring(0, percentStr.indexOf("."));
    $("#div_import_result").hide();
    $("#pross").show();
    var timesRun = percentStr;

    $("#pross .progress-bar").attr('aria-valuenow', timesRun);
    $("#pross .progress-bar").css('width', timesRun + '%');
    $("#pross .progress-bar").html(timesRun + '%');
}
this.ImprotUserBtnSave = function (event, ele) {
    var formData = new FormData();
    var fileInput = document.getElementById("fileField");

    for (var i = 0; i < fileInput.files.length; i++) {
        var file = fileInput.files[i];
        formData.append("file" + i, file);
    }
    page.resultProgress((0), 1)
    $.ajax({
        url: "/User/ImportUser",
        type: "POST",
        data: formData,
        contentType: false, //必须false才会自动加上正确的Content-Type
        processData: false,  //必须false才会避开jQuery对 formdata 的默认处理
        enctype: 'multipart/form-data',
        //xhr: function () {
        //    //获取ajax中的ajaxSettings的xhr对象  为他的upload属性绑定progress事件的处理函数
        //    var myXhr = $.ajaxSettings.xhr();
        //    if (myXhr.upload) {
        //        //检查其属性upload是否存在
        //        myXhr.upload.addEventListener("progress", page.resultProgress, false);
        //    }
        //    return myXhr;
        //},
        success: function (data) {

            if (data.IsSuccess)
                page.getImportUserProcess(data.Data);

            //page.CloseModelDiv(ele);
        },
        error: function (data) {
            console.log(data);
        }
    })
}

this.getImportUserProcess = function (guid) {
    var timestamp = new Date().getTime();
    $.ajax({
        url: "/Common/GetImprotProcess?guid=" + guid + "&t=" + timestamp,
        type: "get",
        success: function (oD) {
            if (oD.IsSuccess) {
                page.resultProgress((oD.Data.SuccessCount + oD.Data.ErrorCount), oD.Data.Total)
                if (oD.Data.IsSuccess) {
                    page.ClearProgress();
                    setTimeout(function () {
                        var message = "共" +oD.Data.Total+
                         "条数据,成功" +oD.Data.SuccessCount+
                          "条数据,失败" +oD.Data.ErrorCount+
                           "条数据";
                        $("#div_import_result").text(message);
                        $("#div_import_result").show();
                        if (oD.Data.ErrorCount > 0)
                            page.Down(null,"/Common/GetImportErrorResult?guid=" + guid,'导入失败日志.cvs');
                    }, 1000);
                } else {
                    setTimeout(function () {
                        page.getImportUserProcess(guid)
                    }, 1000)
                }
            }
        }
    });
}

// 下载导入结果
this.Down = function (formData, url, name) {
    return new Promise((resolve, reject) => {
        var xhr = new XMLHttpRequest();
        xhr.open("get", url, true); // 也可以使用POST方式,根据接口
        xhr.responseType = "blob"; // 返回类型blob
        // 定义请求完成的处理函数,请求前也可以增加加载框/禁用下载按钮逻辑
        xhr.onload = function () {
            // 请求完成
            if (this.status === 200) {
                // 返回200
                var blob = this.response;
                var reader = new FileReader();
                reader.readAsDataURL(blob); // 转换为base64,可以直接放入a表情href
                reader.onload = function (e) {
                                // 转换完成,创建一个a标签用于下载
                                var a = document.createElement("a");
                                a.download = name;
                                a.href = e.target.result;
                                $("body").append(a); // 修复firefox中无法触发click
                                a.click();
                                resolve(200)
                                $(a).remove();
                            };
            }
        };
        // 发送ajax请求
        xhr.send(formData);
    })
};

4、后端代码

// 获取导入进度
[HttpGet]
[Route("GetImportProcess")]
public ResponseResult<ImportProcess> GetImportProcess(Guid guid)
{
    ...
}

// 获取导入结果(文件流的方式输出)
[HttpGet]
public IActionResult GetImportErrorResult(Guid guid)
{
    var fileName = "导入结果.cvs";
    var stream = Encoding.UTF8.GetBytes($"获取失败,{result.Error}");
    return File(stream, "text/plain", fileName);
}

// 导入
[HttpPost]
public IActionResult ImportUser()
{
    var files = Request.Form.Files;
    if (files != null && files.Count > 0)
    {        
        var lst = new List<string>();
        using (var fileStream = item.OpenReadStream())
        {
            using (StreamReader streamReader = new StreamReader(fileStream))
            {
                while (streamReader.Peek() != -1)
                {
                    string str = streamReader.ReadLine();

                    lst.Add(str);
                }
            }
        }
        
        Task.Run(()=>{
            Import(lst);
        });                        
    }

    return Json(new ResponseResult<string>()
    {
        IsSuccess = true,
        Data = Guid.NewGuid()
    });
}

5、设计思路:一共有三个接口,ImportUser、GetImportProcess、GetImportErrorResult。

5.1、导入接口(ImportUser)

上传文件、解析文件内容、检测数据是否合法并导入数据库。

生成一个唯一标识和导入进度(上传成功、失败数量)绑定并写入缓存。

返回唯一标识。

5.2、获取导入进度(GetImportProcess)

跟据导入接口返回的唯一标识到缓存中查询导入进度。前端需要不断的发送请求,直到上传完为止。

5.3、获取导入结果(GetImportErrorResult)

当导入过程中有失败的记录需要已文本文件的形式展示。

导入完成后并且有导入失败的记录那么会调用该接口获取。

通过导入接口返回的唯一标识到缓存中查询并将查询的结果已文件流的形式返回给前端下载。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用Spring Boot的MultipartFile类和Thymeleaf模板引擎实现文件批量上传进度条显示。以下是一个简单的示例代码: 1. 在Spring Boot项目中的HTML模板中添加以下代码: ``` <form id="uploadForm" enctype="multipart/form-data" action="/upload" method="POST"> <div class="form-group"> <input type="file" name="files" multiple="multiple" onchange="this.form.submit()"> </div> </form> <div class="progress"> <div id="progressBar" class="progress-bar" role="progressbar" aria-valuenow="0" aria-valuemin="0" aria-valuemax="100"></div> </div> ``` 2. 在Spring Boot的Controller中添加以下代码: ``` @PostMapping("/upload") public String uploadFiles(@RequestParam("files") MultipartFile[] files, Model model) { int totalFiles = files.length; int uploadedFiles = 0; for (MultipartFile file : files) { // Upload the file // Increase the uploadedFiles counter by 1 // Update the progress bar in the model } return "upload-success"; } ``` 3. 在上传文件的方法中,可以使用Apache Commons FileUpload和IOUtils等工具类来实现文件上传和进度计算,例如: ``` public void uploadFile(MultipartFile file, OutputStream outputStream) throws IOException { InputStream inputStream = file.getInputStream(); int bytesRead = 0; byte[] buffer = new byte[8192]; while ((bytesRead = inputStream.read(buffer, 0, 8192)) != -1) { outputStream.write(buffer, 0, bytesRead); // Update the progress bar in the model based on the number of bytes read } inputStream.close(); outputStream.close(); } ``` 通过以上步骤,你可以使用Spring Boot实现进度条的文件批量上传

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值