整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

Java实例:Vue前端与Java后端实现大文件异步

Java实例:Vue前端与Java后端实现大文件异步上传下载功能

我们项目开发中,大文件上传与下载是一项常见的功能需求,特别是在高并发和用户体验要求高的场景下。Vue.js作为一款流行的前端框架,以其响应式的数据绑定和组件化的优势使得前端交互更加流畅;而Java后端凭借其稳定性和高性能,是构建健壮服务端的理想选择。

老规矩,多余话不说,直接上实现思路与代码。

大文件异步上传功能实现思路:

前端:

  1. 使用HTML5的FormData API封装文件信息,可通过new FormData()并将file对象添加到表单数据中。
  2. 利用axios或其他HTTP库发送POST请求,设置请求头Content-Type为'multipart/form-data'以适应文件上传。
  3. 实现进度条功能,通过监听xhr.upload.onprogress事件实时更新上传进度。

后端:

  1. 接收multipart请求,使用如Commons FileUpload或Spring Boot自带的MultipartFile接口解析文件。
  2. 文件暂存于临时目录或直接上传至云存储服务,如OSS或S3。
  3. 后端处理完成后返回相应状态码和信息,以便前端显示上传结果。

大文件异步下载功能实现思路:

前端:

  1. 前端通过点击事件触发下载动作,向后端发送请求获取文件下载链接或者流式响应。
  2. 对于较大的文件,可以创建隐藏的iframe或者a标签配合download属性,由服务器返回合适的Content-Disposition头来触发浏览器下载。

后端:

  1. 根据请求生成文件下载的响应,设置适当的Content-Type和Content-Disposition头部信息。
  2. 若采用流式传输,可使用Servlet的OutputStream逐块读取文件并发送给客户端,减轻内存压力。

思路有了,直接上代码:

前端Vue部分(使用axios):

前端Vue部分,我们将创建一个简单的上传组件,该组件包括一个文件输入框和一个进度条,用于展示上传进度。这里假设你已经设置了axios,并全局导入。

<!-- Vue组件 -->
<template>
  <div>
    <input type="file" @change="handleFileSelect" />
    <div v-if="uploadProgress > 0">
      上传进度: {{ uploadProgress }}%
      <progress :value="uploadProgress" max="100"></progress>
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      uploadProgress: 0,
      selectedFile: null,
    };
  },
  methods: {
    handleFileSelect(event) {
      this.selectedFile=event.target.files[0];

      let formData=new FormData();
      formData.append('file', this.selectedFile);

      axios.post('/api/upload', formData, {
        headers: {
          'Content-Type': 'multipart/form-data'
        },
        onUploadProgress: (progressEvent)=> {
          this.uploadProgress=Math.round((progressEvent.loaded * 100) / progressEvent.total);
        }
      })
      .then(response=> {
        console.log('File uploaded successfully:', response.data);
        // 清除上传进度并重置文件选择
        this.uploadProgress=0;
        this.selectedFile=null;
      })
      .catch(error=> {
        console.error('Error uploading file:', error);
        this.uploadProgress=0;
      });
    },
  },
};
</script>
// Vue组件内方法
async handleFileUpload(file) {
  const formData=new FormData();
  formData.append('file', file); // 'file' 是从<input type="file">元素获取的文件对象

  const config={
    headers: {
      'Content-Type': 'multipart/form-data'
    },
    onUploadProgress: progressEvent=> {
      this.progress=Math.round((progressEvent.loaded * 100) / progressEvent.total);
    }
  };

  try {
    const response=await axios.post('/api/upload', formData, config);
    console.log(response.data); // 处理后端返回的信息
  } catch (error) {
    console.error(error);
  }
}

后端Java Spring Boot部分(接收文件):

import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.http.ResponseEntity;

@RestController
public class FileController {

    @PostMapping("/api/upload")
    public ResponseEntity<String> handleFileUpload(@RequestParam("file") MultipartFile file) {
        if (file.isEmpty()) {
            return ResponseEntity.badRequest().body("Failed to upload, no file content found.");
        }

        // 获取文件名及扩展名
        String originalFilename=file.getOriginalFilename();

        // 将文件保存到指定路径,这里仅为示例,生产环境中需要考虑磁盘空间、文件命名策略等问题
        try {
            Path path=Paths.get(UPLOADED_FOLDER_PATH + originalFilename);
            Files.write(path, file.getBytes());
            return ResponseEntity.ok("File uploaded successfully");
        } catch (IOException e) {
            return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
                               .body("Failed to upload the file: " + e.getMessage());
        }
    }
}

对于大文件下载,通常后端会提供一个下载链接,前端接收到此链接后,可以通过创建隐藏的<a>标签模拟点击下载,或者利用Blob对象在浏览器中创建可下载的URL。后端可能提供的不是一个链接,而是直接返回带有正确Content-Disposition头的响应体,触发浏览器下载行为。

后端Java Spring Boot部分(提供文件下载):

import org.springframework.core.io.Resource;
import org.springframework.http.HttpHeaders;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.servlet.mvc.method.annotation.StreamingResponseBody;

import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;

@GetMapping("/api/download/{filename}")
public ResponseEntity<StreamingResponseBody> downloadFile(@PathVariable String filename) throws IOException {
    // 这里假设已知文件存放的实际路径
    File file=new File(DOWNLOAD_FOLDER_PATH + filename);

    if (!file.exists()) {
        return ResponseEntity.notFound().build();
    }

    StreamingResponseBody stream=outputStream -> {
        FileInputStream fis=new FileInputStream(file);
        byte[] buffer=new byte[4096];
        int n;
        while ((n=fis.read(buffer)) !=-1) {
            outputStream.write(buffer, 0, n);
        }
        fis.close();
    };

    HttpHeaders headers=new HttpHeaders();
    headers.add(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + filename + "\"");

    return ResponseEntity.ok()
                         .headers(headers)
                         .contentType(MediaType.APPLICATION_OCTET_STREAM)
                         .body(stream);
}

在这个例子中,当用户选择文件后,handleFileSelect方法会被调用,开始上传文件。通过监听onUploadProgress事件,我们可以获取到文件上传的进度,并实时更新到视图层展示给用户。上传完成后,清除上传进度,并允许用户再次选择文件进行上传。如果在上传过程中发生错误,也会捕获异常并显示错误信息。

思路和代码都说完,简单说几句,以上结合Vue前端技术和Java后端技术,我们成功地搭建了一套高效可靠的大文件异步上传下载解决方案。前端通过良好的用户界面提供了直观的上传下载进度反馈,而后端则确保了数据的高效处理与安全传输。这套方案不仅适用于一般企业级应用,也能应对大数据处理的复杂场景。当然,在实际部署和应用中还需注意权限控制、错误处理以及性能优化等方面,以保证系统的整体稳定性与用户体验。

如果有用,请点赞+关注!

ava+超大文件上传与下载,java+超大文件上传与下载解决方案,java+超大文件上传与下载思路,java+超大文件上传与下载实例,java+超大文件上传与下载源码,java+超大文件分块上传与下载,java+超大文件分片上传与下载,java+超大文件切片上传与下载,


java大文件10G,50G,100G上传下载,JSP大文件10G,50G,100G上传下载,JAVA大文件10G,50G,100G上传下载,断点续传。

一般这么大的文件不用HTML的一次性上传,而是采用分块,分片,分段,分割,切割技术上传。

JAVA话一般是负责后端的逻辑,比如文件初始化,文件块上传,合并,存储等。

前端的话用JSP,VUE2,VUE3,React,HTML5,JS,JQ都行。这个都无所谓。

痛点就是刷新继续,批量上传,批量下载。网上能够做到批量下载,文件夹下载的,搜了一下,几乎没有,全部都是讲的上传,基本上都是用的HTML5的API,也就是Chrome的API,关键是这个API不支持IE。在政府单位用不了。还有一些企业也不用了。

网上一般的做法都是用的HTML5的API,也就是chrome提供的API,能够满足基本需求,但是还是有痛点,chrome限制死了,固定死了无法扩展,每个域名只允许5个TCP连接,导致了速度有上限,你也无法修改和扩展。然后就是浏览器也只能用chrome,用户用了IE就不行了,用户现有的系统跑在IE上,也不能换。

进度信息容易丢失,用户关闭网页,刷新网页,关闭浏览器,重启浏览器,关闭电脑,重启电脑后,进度信息都会丢失,无解,没办法。扩展性还是差了点。

下载,网上找到的资料一般都是讲上传的,很少讲下载的。

断点续传,就是在文件上传的过程中发生了中断,人为因素(暂停)或者不可抗力(断网或者网络差)导致了文件上传到一半失败了。然后在环境恢复的时候,重新上传该文件,而不至于是从新开始上传的。

断点续传的功能是基于分块上传来实现的,把一个大文件分成很多个小块,服务端能够把每个上传成功的分块都落地下来,客户端在上传文件开始时调用接口快速验证,条件选择跳过某个分块。

实现原理,就是在每个文件上传前,就获取到文件MD5取值,在上传文件前调用接口,如果获取的文件状态是未完成,则返回所有的还没上传的分块的编号,然后前端进行条件筛算出哪些没上传的分块,然后进行上传。

当接收到文件块后就可以直接写入到服务器的文件中。


导入项目:
导入到Eclipse:
http://www.ncmem.com/doc/view.aspx?id=9da9c7c2b91b40b7b09768eeb282e647
导入到IDEA:http://www.ncmem.com/doc/view.aspx?id=9fee385dfc0742448b56679420f22162
springboot统一配置:http://www.ncmem.com/doc/view.aspx?id=7768eec9284b48e3abe08f032f554ea2



下载示例:

https://gitee.com/xproer/up6-jsp-eclipse/tree/6.5.40/




工程



NOSQL

NOSQL示例不需要任何配置,可以直接访问测试



创建数据表

选择对应的数据表脚本,这里以SQL为例




修改数据库连接信息


访问页面进行测试



文件存储路径

up6/upload/年/月/日/guid/filename






相关问题:
1.javax.servlet.http.HttpServlet错误
2.项目无法发布到tomcat
3.md5计算完毕后卡住
4.服务器找不到config.json文件

相关参考:

文件保存位置


源码工程文档:https://drive.weixin.qq.com/s?k=ACoAYgezAAw1dWofra

源码报价单:https://drive.weixin.qq.com/s?k=ACoAYgezAAwoiul8gl



OEM版报价单:https://drive.weixin.qq.com/s?k=ACoAYgezAAwuzp4W0a

产品源代码:https://drive.weixin.qq.com/s?k=ACoAYgezAAwbdKCskc
授权生成器:https://drive.weixin.qq.com/s?k=ACoAYgezAAwTIcFph1

HTML5实现分片上传GB级大文件组件,用HTML实现分片上传GB级大文件组件,用javascript实现分片上传GB级大文件组件,用js实现分片上传GB级大文件组件,用vue2实现分片上传GB级大文件组件,用vue3实现分片上传GB级大文件组件,用HTML5实现分片上传1GB级大文件组件,用HTML5实现分片上传5GB级大文件组件,用HTML5实现分片上传10GB级大文件组件,用HTML5实现分片上传50GB级大文件组件,用HTML5实现分片上传100GB级大文件组件,用HTML5实现分块上传GB级大文件组件,用HTML5实现分段上传GB级大文件组件,用HTML5实现分割上传GB级大文件组件,用HTML5实现切割上传GB级大文件组件,用HTML5实现分片上传GB级大文件控件,用HTML5实现分片上传GB级大文件技术,用HTML5实现分片上传GB级大文件方案,用HTML5实现分片上传GB级大文件教程,

1.下载示例

https://gitee.com/xproer/up6-vue-cli



将up6组件复制到项目中

示例中已经包含此目录



1.引入up6组件



2.配置接口地址

接口地址分别对应:文件初始化,文件数据上传,文件进度,文件上传完毕,文件删除,文件夹初始化,文件夹删除,文件列表

参考:http://www.ncmem.com/doc/view.aspx?id=e1f49f3e1d4742e19135e00bd41fa3de



3.处理事件



启动测试



启动成功



效果



数据库