java通过MultipartFile进行文件、图片上传和下载,以及文件流

2023-11-20

 java通过MultipartFile进行文件、图片上传和下载,以及文件流

package com.fh.controller;


import com.fh.util.UuidUtil;
import org.apache.commons.io.IOUtils;
import org.apache.ibatis.javassist.tools.reflect.CannotCreateException;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.apache.shiro.authz.annotation.RequiresUser;
import org.apache.shiro.session.Session;
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.ResponseBody;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import javax.imageio.ImageIO;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.*;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.text.ParseException;
import java.util.Random;

@Controller
@RequestMapping(value = "/")
public class MainController {

    //图片上传接口
    public static String  upLoadFile(MultipartFile file, HttpServletRequest request) {
        if (file == null) {
            return  "文件不能为空";
        }


        String fileName = file.getOriginalFilename();
        int index = fileName.lastIndexOf(".");
        if (index < 0){
        return  "文件格式不能为空"; 
        } else {
            String fileType = fileName.substring(fileName.lastIndexOf(".") + 1, fileName.length());
            if (",jpg,jpeg,png,pdf".indexOf(fileType) < 0){
        return  "文件类型不合法,只支持jpg、jpeg、png和pdf格式的文件";  
            }
        }


        String path = "";
        try {
            String id = storeFile(file.getOriginalFilename(), file.getInputStream(), file.getContentType());
            path = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort()
                    + request.getContextPath() + "/downFile?fileUrl=" + URLEncoder.encode(id, "UTF-8");
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println( "======================================  文件上传失败  =======================");
        }
        return path;
    }

    //    d:/test/files/ 这里上传地址是写死的,正常开发是需要写到配置文件里面读取的
    public static String storeFile(String fileName, InputStream inputStream, String contentType) throws Exception {
        FileOutputStream out = null;
        File file2 = null;
        try {
            file2 = new File( "d:/test/files/" + UuidUtil.get32UUID() + "/" + fileName);
            if (!file2.getParentFile().exists()) {
                file2.getParentFile().mkdirs();
            }
            boolean flag = file2.createNewFile();
            if (!flag) {
                throw new CannotCreateException("文件无法被创建");
            }
            out = new FileOutputStream(file2);
            byte[] tmp = new byte[1024];
            int i = -1;
            while ((i = inputStream.read(tmp)) != -1) {
                out.write(tmp, 0, i);
            }
            //return URLEncoder.encode(file2.getAbsolutePath(), "UTF-8");
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("======================================  文件上传失败  ================================");
        } finally {
            IOUtils.closeQuietly(out);
            IOUtils.closeQuietly(inputStream);
        }
        return URLEncoder.encode(file2.getAbsolutePath(), "UTF-8");
    }



    //图片回显查看接口
    @RequestMapping(value="/downFile")
    public void viewPic(String fileUrl, HttpServletResponse response) {
        try {
            String path = URLDecoder.decode(fileUrl, "UTF-8");
            File file = new File(path);
            response.addHeader("Content-Length", "" + file.length());
            writeFile(path, response);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }


    public void writeFile(String id, HttpServletResponse response) {
        try {
            String name = id.substring(id.lastIndexOf(java.io.File.separator) + java.io.File.separator.length(), id.length());
            renderResponseFileHeader(name, response);
            writeFile(name, id, response.getOutputStream());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }


    public static void writeFile(String title, String path, OutputStream outputStream) throws Exception {
        InputStream in = null;
        try {
            // 4.获取要下载的文件输入流
            in = new FileInputStream(path);
            int len = 0;
            // 5.创建数据缓冲区
            byte[] buffer = new byte[1024];
            // 6.通过response对象获取OutputStream流
            // 7.将FileInputStream流写入到buffer缓冲区
            while ((len = in.read(buffer)) > 0) {
                // 8.使用OutputStream将缓冲区的数据输出到客户端浏览器
                outputStream.write(buffer, 0, len);
            }
            IOUtils.closeQuietly(outputStream);
        } finally {
            IOUtils.closeQuietly(in);
        }
    }

    public static void  renderResponseFileHeader(String fileName, HttpServletResponse response) throws Exception {
        response.setHeader("Content-Disposition",
                "attachment; filename=" + java.net.URLEncoder.encode(fileName, "UTF-8"));
    }


    //通过文件路径获取文件名称
    public static String getFileName(String path) throws Exception {
        path = URLDecoder.decode(path, "UTF-8");
        String name = path.substring(path.lastIndexOf(java.io.File.separator) + java.io.File.separator.length(), path.length());
        return name;
    }




    //删除图片的同时也要删除服务端存储的图片,减少垃圾文件,优化硬盘空间
	@RequestMapping(value = "/imgPath", produces = "application/json;charset=utf-8")
	@ResponseBody
	public ResponseJson detail(String imgPathString) {
		//boolean file = FileUtils.deletePhysicalFile(imgPathString);
        boolean file = deletePhysicalFile(imgPathString);
		return new ResponseJson(Constants.CODE_SUCCESS, file);
	}

     //删除物理文件   //删除服务端存储的图片
    public static boolean deletePhysicalFile(String fileUrl) {
        if (fileUrl == null || fileUrl.length() == 0) return false;
        String path = null;
        boolean isDelete = false;
        try {
            String splitReg = "/downFile\\?fileUrl=";
            String[] fileUrlStrs = fileUrl.split(splitReg);
            path = fileUrlStrs[fileUrlStrs.length - 1];
            path = URLDecoder.decode(path, "UTF-8");  //  UTF-8  编码反编译 解密
            path = URLDecoder.decode(path, "UTF-8");  //  UTF-8  编码反编译 解密
        } catch (Exception e) {
            e.printStackTrace();
        }
        File file = new File(path);
        if (file.exists()) {
            if (file.delete()) {
                String filePath = file.getParent();
                deleteEmptyDirectory(filePath);
            }
            isDelete = true;
        }
        return isDelete;
    }
    public static void deleteEmptyDirectory(String path){
        File fileDir = new File(path);
        if (fileDir.listFiles().length > 0)
            return;
        else {
            fileDir.delete();
        }
    }




}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java通过MultipartFile进行文件、图片上传和下载,以及文件流 的相关文章

随机推荐

  • 5种方法教你用Python玩转histogram直方图

    作者 xiaoyu 知乎 https zhuanlan zhihu com pypcfx 介绍 一个半路转行的数据挖掘工程师 直方图是一个可以快速展示数据概率分布的工具 直观易于理解 并深受数据爱好者的喜爱 大家平时可能见到最多就是 mat
  • 腾讯技术面经-后台-云计算虚拟化部门

    1 笔试 不区分 都是软开岗位 2个小时 一般1小时足够了 25道选择题 10道填空 还有2个选做题 涉及到操作系统 内存 HTTP协议 TCP UDP协议 LLR 0 LLR 1 数据结构 算法 C语言 协议 Ipv4
  • UE5学习笔记(一)——界面功能梳理&第一天知识点记录

    学习UE5的第一步 是软件安装 默认是安装好的 由于安装没有太多技术含量 所以就没有专门做记录 这里有个注意点 虚幻引擎是整合在Epic games launcher中的 也就是说开发引擎内嵌在游戏平台上 打个比方 就是如果你要下unity
  • SpringBoot项目拦截器过滤器配置

    1 我们在配置拦截器时需实现接口HandlerInterceptor package com example springbootdemo common conf interceptor import com example springb
  • QT窗体间传值总结

    在写程序时 难免会碰到多窗体之间进行传值的问题 依照自己的理解 我把多窗体传值的可以使用的方法归纳如下 1 使用QT中的Signal Slot机制进行传值 2 使用全局变量 3 使用public形式的函数接口 4 使用QT中的Event机制
  • pytesseract和PIL库用法是什么?【详细教程】

    Tesseraet是一个命令行工具 安装后只能通过tsseraet命令在Python的外部运行 而不能通过import语句引人使用 为了解决上述问题 Python 提供了支持Tssraec OCR引擎的Python版本的库pytessera
  • 04. 《Lombok 实战 —— @NoArgsConstructor, @RequiredArgsConstructor, @AllArgsConstructor》

    文章目录 Lombok 实战 NoArgsConstructor RequiredArgsConstructor AllArgsConstructor 1 NoArgsConstructor 1 1 NoArgsConstructor 实战
  • 夯实C++基础之刷题:链表——3合并两个有序列表

    题目 解题 递归和迭代 我的理解 递归是自己调用自己 迭代是按思路往下走 1 递归 class Solution public ListNode mergeTwoLists ListNode list1 ListNode list2 递归
  • 敏捷开发概述

    一 历史背景 20世纪60年代 软件规模小 已作坊式开发为主 20世纪70年代 硬件快速发展 软件规模和复杂度不同以往 引发软件危机 20世纪80年代 引入瀑布模型 以过程为中心分阶段控制软件开发 20世纪90年代 软件开发过程日益变重 开
  • mysql清缓存、查看连接数及链接时间

    mysql清缓存 查看连接数及链接时间 flush privileges 刷新缓存 SHOW FULL processlist 查看连接数据库的进程id ip 用户名 连接的数据库 连接状态 连接时长等 show variables lik
  • Node.js程序如何建立及使用Model

    建立Model 直接使用Sequelize虽然可以 但是存在一些问题 团队开发时 有人喜欢自己加timestamp var Pet sequelize define pet id type Sequelize STRING 50 prima
  • Unity中loading页加载的实现

    首先创建一个Global cs 使用单例用于存储场景的名字 便于后续脚本的调用 此脚本不必挂载在游戏物体上 using UnityEngine using System Collections public class Global Mon
  • Eclipse项目上有红色的叉或感叹号

    Eclipse中导入的项目没有报错 甚至都能正常运行 但就是会有一个红色的 或 对于一个有强迫症的我 忍不了 下面怎么解决 我提供一个平时解决的方法 首先 这个报错是IDE工具的报错 先找到报错描述 window gt show view
  • Go语言学习路线

    gogogo git 地址 Go 学习 学习路线 2 基础知识 3 开发工具安装地址 下载 Go基础知识 链接为gitee地址 放心查看 基础结构 learn1 go 基础语法 learn2 go 数据类型 learn3 go 变量 lea
  • mkfs.xfs: cannot open /dev/sdb1: Device or resource busy 设备或资源忙

    今天在centos下用xfs格式化磁盘出现如下错误 mkfs xfs cannot open dev sdb1 Device or resource busy 设备或资源忙 时出现 重启服务器后再格式化也一样 也就是重启服务器没什么用 用l
  • QT之一个UI里边多界面切换

    QT之多界面交换 环境 VS2019 QT tools 从网上查看了许多大神的帖子 先将多界面切换的方法总结如下 1 可以通过QT Designer中添加Containers控件里的Stacked Widget实现同一个UI里的页面切换 可
  • multisim仿真 74LS147D芯片

    multisim仿真 74LS147D芯片
  • el-input-number默认值为空怎么设置

    el input number 没有值的情况下 默认值为0 一般没有值的情况下默认值为空 需要将默认值 undefined
  • 【PDF】PDF无法注释的一种解决方案

    PDF无法注释 需要检查 1 权限问题 2 文档规范问题 PDF A 拓展阅读 浏览器打开PDF调整亮度和颜色的小技巧 处理pdf 文档的相关功能包总结 1 pdf文档不能注释 下载的一篇pdf文档在阅读时不能注释 高亮和打字机等选项都是灰
  • java通过MultipartFile进行文件、图片上传和下载,以及文件流

    java通过MultipartFile进行文件 图片上传和下载 以及文件流 package com fh controller import com fh util UuidUtil import org apache commons io