代码编织梦想

文件上传下载最好的项目可以和若依项目完美整合

https://gitee.com/luckytuan/fast-loader

package cn.fastloader.web.controller;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import cn.fastloader.util.FileInfoUtils;
import cn.fastloader.util.ServletUtils;
import cn.fastloader.web.model.ApiResult;
import cn.fastloader.web.model.QueryInfo;
import cn.fastloader.web.model.TChunkInfo;
import cn.fastloader.web.model.TFileInfo;
import cn.fastloader.web.model.TFileInfoVO;
import cn.fastloader.web.model.UploadResult;
import cn.fastloader.web.service.ChunkService;
import cn.fastloader.web.service.FileInfoService;

/**
 * 上传下载文件
 * @author 洋葱骑士
 * 源码地址:https://gitee.com/luckytuan/fast-loader
 *
 */
@RestController
@RequestMapping("/uploader")
public class FileController {
	
    @Value("${prop.upload-folder}")
    private String uploadFolder;
    
    @Resource
    private FileInfoService fileInfoService;
    
    @Resource
    private ChunkService chunkService;

    private final Logger logger = LoggerFactory.getLogger(FileController.class);
    
    /**
     * 上传文件块
     * @param chunk
     * @return
     */
    @PostMapping("/chunk")
    public String uploadChunk(TChunkInfo chunk) {
    	String apiRlt = "200";
    	
        MultipartFile file = chunk.getUpfile();
        logger.info("file originName: {}, chunkNumber: {}", file.getOriginalFilename(), chunk.getChunkNumber());

        try {
            byte[] bytes = file.getBytes();
            Path path = Paths.get(FileInfoUtils.generatePath(uploadFolder, chunk));
            //文件写入指定路径
            Files.write(path, bytes);
            if(chunkService.saveChunk(chunk) < 0) apiRlt = "415";
            
        } catch (IOException e) {
            e.printStackTrace();
            apiRlt = "415";
        }
        return apiRlt;
    }

    @GetMapping("/chunk")
    public UploadResult checkChunk(TChunkInfo chunk, HttpServletResponse response) {
    	UploadResult ur = new UploadResult();
    	
    	//默认返回其他状态码,前端不进去checkChunkUploadedByResponse函数,正常走标准上传
    	response.setStatus(HttpServletResponse.SC_NOT_MODIFIED);
    	
    	String file = uploadFolder + "/" + chunk.getIdentifier() + "/" + chunk.getFilename();
    	
    	//先判断整个文件是否已经上传过了,如果是,则告诉前端跳过上传,实现秒传
    	if(FileInfoUtils.fileExists(file)) {
    		ur.setSkipUpload(true);
    		ur.setLocation(file);
    		response.setStatus(HttpServletResponse.SC_OK);
    		ur.setMessage("完整文件已存在,直接跳过上传,实现秒传");
    		return ur;
    	}
    	
    	//如果完整文件不存在,则去数据库判断当前哪些文件块已经上传过了,把结果告诉前端,跳过这些文件块的上传,实现断点续传
    	ArrayList<Integer> list = chunkService.checkChunk(chunk);
    	if (list !=null && list.size() > 0) {
    		ur.setSkipUpload(false);
    		ur.setUploadedChunks(list);
    		response.setStatus(HttpServletResponse.SC_OK);
    		ur.setMessage("部分文件块已存在,继续上传剩余文件块,实现断点续传");
    		return ur;
        }
        return ur;
    }

    @PostMapping("/mergeFile")
    public String mergeFile(@RequestBody TFileInfoVO fileInfoVO){
    	
    	String rlt = "FALURE";
    	
    	//前端组件参数转换为model对象
    	TFileInfo fileInfo = new TFileInfo();
    	fileInfo.setFilename(fileInfoVO.getName());
    	fileInfo.setIdentifier(fileInfoVO.getUniqueIdentifier());
    	fileInfo.setId(fileInfoVO.getId());
    	fileInfo.setTotalSize(fileInfoVO.getSize());
    	fileInfo.setRefProjectId(fileInfoVO.getRefProjectId());
    	
    	//进行文件的合并操作
        String filename = fileInfo.getFilename();
        String file = uploadFolder + "/" + fileInfo.getIdentifier() + "/" + filename;
        String folder = uploadFolder + "/" + fileInfo.getIdentifier();
        String fileSuccess = FileInfoUtils.merge(file, folder, filename);
        
        fileInfo.setLocation(file);
        //文件合并成功后,保存记录至数据库
        if("200".equals(fileSuccess)) {
        	if(fileInfoService.addFileInfo(fileInfo) > 0) rlt = "SUCCESS";
        }
        //如果已经存在,则判断是否同一个项目,同一个项目的不用新增记录,否则新增
        if("300".equals(fileSuccess)) {
        	List<TFileInfo> tfList = fileInfoService.selectFileByParams(fileInfo);
        	if(tfList != null) {
        		if(tfList.size() == 0 || (tfList.size() > 0 && !fileInfo.getRefProjectId().equals(tfList.get(0).getRefProjectId()))) {
        			if(fileInfoService.addFileInfo(fileInfo) > 0) rlt = "SUCCESS";
        		}
        	}
        }
        
        return rlt;
    }
    
    /**
     * 查询列表
     *
     * @return ApiResult
     */
    @RequestMapping(value = "/selectFileList", method = RequestMethod.POST)
    public ApiResult selectFileList(@RequestBody QueryInfo  query){  
        PageHelper.startPage(query.getPageIndex(), query.getPageSize()); 
        List<TFileInfo> list =  fileInfoService.selectFileList(query);		
        PageInfo<TFileInfo> pageResult = new PageInfo<>(list);				
        return ApiResult.success(pageResult);
    }
  
    /**
     * 下载文件
     * @param req
     * @param resp
     */
    @RequestMapping(value = "/download", method = RequestMethod.GET)
    public void download(HttpServletRequest req, HttpServletResponse resp){
    	String location = req.getParameter("location"); 
    	String fileName = req.getParameter("filename");
    	BufferedInputStream bis = null;
        BufferedOutputStream bos = null;
        OutputStream fos = null;
        try {
            bis = new BufferedInputStream(new FileInputStream(location));
            fos = resp.getOutputStream();
            bos = new BufferedOutputStream(fos);
            ServletUtils.setFileDownloadHeader(req, resp, fileName);
            int byteRead = 0;
            byte[] buffer = new byte[8192];
            while ((byteRead = bis.read(buffer, 0, 8192)) != -1) {
                bos.write(buffer, 0, byteRead);
            }
        } catch (Exception e) {
        	e.printStackTrace();
        } finally {
            try {
                bos.flush();
                bis.close();
                fos.close();
                bos.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    
    /**
     * 删除
     */
    @RequestMapping(value = "/deleteFile", method = RequestMethod.POST)
    public ApiResult deleteFile(@RequestBody TFileInfo tFileInfo ){     	        
    	int result = fileInfoService.deleteFile(tFileInfo);		
        return ApiResult.success(result);
    }
}

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/m0_56095048/article/details/129831029

spring+springmvc+mybatis 整合【非maven项目】_阿布布_0410的博客-爱代码爱编程

入行一年多了,总是在用框架,却很少自己搭建过框架,最近有时间终于自己搭了一套简单的框架,分享一下,以便后面在用的到。 项目采用Spring4.0和Mybatis3.3的版本。 源码下载地址 1、准备工作。 首先是准备工作,创建数据库连接地址的配置文件jdbc.properties,日志配置文件log4j.properties,Mybatis特性配置

spring整合ueditor富文本编辑器,并上传图片(最全教程)_java开发之旅的博客-爱代码爱编程

目录   前戏 创建项目 下载UEditor的JSP版本 在服务器端进行编码配置 在前端页面使用并配置UEditor编辑器 实现上传图片的功能(上传附件、文件等同理) 前戏 博主最近在做的项目中,有一个发布新闻的需求,所以用到了富文本编辑器,经过前端人员的对比分析,最终采用了百度开源的UEditor编辑器。 但是这个事情并不是前端一个

bootstrap fileinput 插件整合,完美实现各文件上传,删除。_何xiao树的博客-爱代码爱编程

fileinput 这个插件,实用美观 ,总的来说就是好使,但是在配置整合上,一般都会耗时间。这里我专门花了两天时间做了个整理, 下载的官网最新版 V5.0 调试成功这里记录一波; 分享给大家,有爱自取,同时做个记录! 基

C++调用webService服务,解决中文乱码和文件上传问题-爱代码爱编程

前言     之前写了一篇c++发布webService服务,可惜阅读量极少,但是也确实帮助了一位有需要的人,也算是一点点欣慰。现在我再写一篇c++调用webService服务篇,包括中文传输和文件上传。     项目需要这个东西,我写一个代码示例,具体的项目代码肯定不会发布出来。遇到的坑有不少,好在一一解决了,该科学上网还是得科学上网,能解决不少问题

SpringCloud 项目整合 minio-爱代码爱编程

说在前面的话 项目当中经常会遇到要上传什么东西,或者下载的问题. 所以OSS对象存储就这样诞生了,比如说阿里云的对象存储几块钱一个月. 但是有的公司因为要存的东西有点奇特,存放在这些云上可能第二天大家都要提桶跑路了. 所以能把这些东西放在一个自己认为安全的地方. 然后就是各种各样的文件存储系统就出现了. minio是什么? minio是一个分布式

Springboot项目中需整合的依赖集和文件配置-爱代码爱编程

文章目录 (一)springboot项目中需整合的依赖集1. 整合Mysql数据库的依赖2. 整合Mybatis的依赖3. 整合druid数据库的依赖4. 整合lombok数据库的依赖5. 整合Shiro数据库的依赖6. 整合thymeleaf数据库的依赖7. 整合Shiro-thymeleaf的依赖8. 整合devtools的依赖(二)Sprin

谷粒学院项目整合SpringSecurity进行用户认证和用户授权-爱代码爱编程

注意:虽然写的有点多,但别慌,我还有视频版讲解:https://www.bilibili.com/video/BV13K4y1f7DX 1、往数据库中添加表 从上到下依次是权限表、角色表、角色和权限关系表、用户表、用户和角色关系表 2、整合后端 新建spring_security模块、service_acl模块 还需要在在common_uti

java web开发框架下载文件_Portal-Basic Java Web 应用开发框架:应用篇(四) —— 文件上传和下载...-爱代码爱编程

Portal-Basic Java Web应用开发框架(简称 Portal-Basic)是一套功能完备的高性能Full-Stack Web应用开发框架,内置稳定高效的MVC基础架构和DAO框架(已内置Hibernate、MyBatis和JDBC支持),集成 Action拦截、Form Bean / Dao Bean / Spring Bean装配、国际

金蝶Apusic 应用服务器9.0版本上,springboot项目关于文件上传的一个问题-爱代码爱编程

项目部署在金蝶v9上使用文件上传时,请求接口获取不到参数。但是在本地启动应用是可以获取到参数,没有任何问题。 @RequestMapping("doUpload") public void doUpload(DocAttaPage page,@RequestParam(value = "file") MultipartFile file,

瑞吉外卖项目开发文档1——基础功能_vincewm的博客-爱代码爱编程

用于复习快速回顾。 目录 1 项目介绍 1.1 技术选型 1.2 功能架构 2 数据库建库建表 3 开发环境 3.1 Maven搭建 3.2 启动测试 3.3 导入前端页面 4 数据库实体类映射 4 账户操作 4.1 登陆功能 4.1.1实体类和结果类 4.1.2 dao,service,controller 4.1.3 拦截

java大型企业级练手项目——尚医通【视频+文档+代码】-爱代码爱编程

一、项目简介 尚医通是一个网上预约挂号系统,包含后台管理系统和前台用户系统,采用前后端分离开发模式。项目技术应用广泛,涵盖微服务、全栈、集群、分布式、高并发;技术应用场景合理,并非多技术的盲目堆叠;业务场景贴近实际,按照市场需求开发。 项目后端技术栈,采用主流的SpringBoot+SpringCloud微服务架构,广泛使用了目前流行的NoSQ