使用原生Java Web来实现大文件的上传

BigFileUpload

wen icon

目录

背景介绍

这个项目是在朋友的一次面试中,面试人提出了一个问题.
我有一个100M的文件,然后我的宽带只有10M,我应该如何处理用户上传的文件?
根据这个问题,我小试牛刀,写了这个项目.

期间查阅了资料,借鉴了Fourwen的项目的前端框架和md写法.

再次感谢.

项目介绍

项目采用如下:

  • 上层: Java, JDK8, Tomcat8,
  • 服务端: Jsp, 原生
  • 前端: webuploader, bootstrap, jquery

来进行开发,

针对文件的上传,一般可以考虑的功能点有

断点续传 在断网或者在暂停的情况下,能够在上传断点中继续上传。

分块上传 也是断点续传的基础之一,把大文件通过前端分块,然后后台在组在一起。

文件秒传 服务中已经有人上传过文件,其他人再上传这个文件直接记录并放回成功。

其他功能 下面这些功能归类到其他,是因为它们基本都是通过WebUploader来实现的,很简单。

- 多线程上传 多个线程上传不同的块文件。 
- 文件进度显示 显示文件的上传完成情况。 

使用说明

获取代码

不会经常更新,下一步会做一个集合公司内部网址的项目.

需要知识点

  • 项目使用nio来进行文件的读取和创建
  • 使用原生web来开发,不使用任何框架
  • 使用Apache提供的fileupload来实现上传数据的获取
  • 使用Apache提供的codec来实现md5加密
  • 并发的理解

启动项目

项目示范

功能分析

分块上传可以说是我们整个项目的基础,像断点续传、暂停这些都是需要用到分块。
分块这块相对来说比较简单。前端是采用了webuploader,分块等基础功能已经封装起来,使用方便。
借助webUpload提供给我们的文件API,前端就显得异常简单。

   var uploader = WebUploader.create({

        // swf文件路径
        swf: '${ctx}/webuploader-0.1.5/Uploader.swf',

        // 文件接收服务端。
        server: '${ctx}/upload.do',
        //文件上传请求的参数表,每次发送都会发送此对象中的参数
        formData: {
          
  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
可以使用Java的原生API实现多线程上文件,具体步骤如下: 1. 在前端页面中添加文件表单,使用POST请求方式提交表单,表单的请求头必须设置为multipart/form-data。 2. 在后端代码中创建一个线程池,用于同时处理多个文件任务。 3. 在后端代码中实现一个Runnable接口的类,用于处理单个文件的上任务。 4. 在上任务的run()方法中,使用Java的原生API读取上文件流,将文件保存到指定的文件夹中。 5. 在文件完成后,将上成功的文件信息存储到数据库中。 下面是一个简单的示例代码: ```java public class FileUploadTask implements Runnable { private FileItem fileItem; private String filePath; public FileUploadTask(FileItem fileItem, String filePath) { this.fileItem = fileItem; this.filePath = filePath; } public void run() { try { InputStream inputStream = fileItem.getInputStream(); String fileName = fileItem.getName(); File file = new File(filePath + File.separator + fileName); FileOutputStream outputStream = new FileOutputStream(file); byte[] buffer = new byte[1024]; int len; while ((len = inputStream.read(buffer)) > 0) { outputStream.write(buffer, 0, len); } outputStream.close(); inputStream.close(); } catch (Exception e) { e.printStackTrace(); } } } public class FileUploadServlet extends HttpServlet { private static final long serialVersionUID = 1L; protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String uploadPath = "D:/upload"; DiskFileItemFactory factory = new DiskFileItemFactory(); ServletFileUpload upload = new ServletFileUpload(factory); try { List<FileItem> items = upload.parseRequest(request); ExecutorService executorService = Executors.newFixedThreadPool(5); for (FileItem item : items) { if (!item.isFormField()) { Runnable task = new FileUploadTask(item, uploadPath); executorService.execute(task); } } executorService.shutdown(); while (!executorService.isTerminated()) { Thread.sleep(1000); } response.getWriter().println("Upload completed successfully!"); } catch (Exception e) { e.printStackTrace(); response.getWriter().println("Upload failed!"); } } } ``` 这个示例代码使用Java的ExecutorService线程池来管理多线程上任务,同时也使用Java的ServletFileUpload和DiskFileItemFactory类来解析multipart/form-data类型的请求。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值