精华内容
下载资源
问答
  • Java MultipartFile 上传文件/上传图片1. 判断允许上传文件的 后缀/图片后缀工具类2. 上传接口3. 上传成功 1. 判断允许上传文件的 后缀/图片后缀工具类 import org.springframework.stereotype.Component; import ...

    1. 判断允许上传文件的 文件后缀/图片后缀/相片后缀 和 其它工具类

    
    import org.springframework.stereotype.Component;
    import java.io.File;
    import java.util.Arrays;
    import java.util.List;
    
    @Component
    public class FileUtil {
        public static final List<String> IMAGE_EXTENSIONS = Arrays.asList(".jpg", ".jpeg", ".png");
    }
    
    import java.util.UUID;
    
    public class CommonUtil {
        public static String getUUID() {
            String uuid = UUID.randomUUID().toString().replaceAll("-", "");
            return uuid;
        }
    }
    
    import java.time.LocalDateTime;
    import java.time.format.DateTimeFormatter;
    
    public class DateUtil {
        public static final String HH = "HH";
        public static final String YYYY_MM_DD = "yyyy-MM-dd";
        public static final DateTimeFormatter FORMATTER_HH = DateTimeFormatter.ofPattern(HH);
        public static final DateTimeFormatter FORMATTER_YYYY_MM_DD = DateTimeFormatter.ofPattern(YYYY_MM_DD);
        public static String getHH() {
            return FORMATTER_HH.format(LocalDateTime.now());
        }
        public static String getYYYYMMDD() {
            return FORMATTER_YYYY_MM_DD.format(LocalDateTime.now());
        }
    }
    
    

    2. 上传接口

    
    @PostMapping("/updateImage.do")
        public Map<String, String> updateImage(@RequestParam("image") MultipartFile[] multfiles)  {
        	Map<String, String> result = new HashMap<>();
            if (multfiles.length == 0) {
    			result.put("message", "请选择图片!");
    			return result;
            }
    
            // 源文件名称
            final String originalFileName = multfiles[0].getOriginalFilename();
            if (StringUtils.isBlank(originalFileName)) {
    			result.put("message", "请选择图片!");
    			return result;
            }
    
            // 文件后缀[.jpg]
            final String suffix = originalFileName.substring(originalFileName.lastIndexOf(".")).toLowerCase();
            if (!FileUtil.IMAGE_EXTENSIONS.contains(suffix)) {
    			result.put("message", "图片格式错误!");
    			return result;
            }
    
            String lastFilePath;
            String newFileName = CommonUtil.getUUID() + suffix;
            String folderName = File.separator + "temp" + File.separator;
            String relativePath = folderName + DateUtil.getYYYYMMDD() + File.separator + DateUtil.getHH();
            String filePath = "D:\\file" + relativePath;
            String fileUrl = null;
            File targetFile = new File(filePath);
            if (!targetFile.exists()) {
                targetFile.mkdirs();
            }
            FileOutputStream out = null;
            try {
                lastFilePath = filePath + File.separator + newFileName;
                out = new FileOutputStream(lastFilePath);
                out.write(multfiles[0].getBytes());
                fileUrl = "http://127.0.0.1:9000" + relativePath + File.separator + newFileName;
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                if (out != null) {
                    try {
                        out.flush();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                    try {
                        out.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
    
            if (fileUrl == null) {
    			result.put("message", "图片上传失败!");
    			return result;
            }
    
    		result.put("message", "上传成功!");
    		result.put("url", fileUrl);
    		return result;
        }
    
    

    3. 上传成功

    
    url => http://127.0.0.1:9000/temp/2019-09-12/14/0eac00b96f134652b34172e84febe8d1.jpg
    
    

    如果您觉得有帮助,欢迎点赞哦 ~ 谢谢!!

    展开全文
  • 主要介绍了Java利用MultipartFile实现上传多份文件的代码,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
  • Java MultipartFile实现文件上传(一)

    千次阅读 2021-02-03 17:54:41
    使用MultipartFile上传至本地或者文件服务器 直接上代码 一、前端上传至服务端(controller层) package com.cargps.common; import com.alibaba.fastjson.JSON; import ...

    使用MultipartFile上传至本地或者文件服务器

    直接上代码

    一、前端上传至服务端(controller层)

    package com.cargps.common;
    
    import com.alibaba.fastjson.JSON;
    import com.app.base.basecontroller.BaseController;
    import com.app.model.common.FileUploadEntity;
    import com.app.service.common.FileUploadService;
    import com.app.util.Common;
    import org.apache.commons.lang3.StringUtils;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.*;
    import org.springframework.web.multipart.MultipartFile;
    
    import java.util.ArrayList;
    import java.util.List;
    import java.util.Map;
    
    /**
     * 文件/图片上传公共接口
     *
     * @Author Smily
     * @DateTime 2021年2月3日
     */
    @RequestMapping(value = "/fileUpload/")
    public class FileUploadController extends BaseController {
    
        public static Logger logger = LoggerFactory.getLogger(FileUploadController.class);
    
    	@Autowired
    	private FileUploadService fileUploadService;
    
    
    	/**
    	 * 文件/图片上传
    	 * @param files 文件集合
    	 * @param type 1储存相对路径 2储存绝对路径
    	 * @return
    	 * @Author Smily
    	 * @DateTime 2020年7月14日
    	 */
    	@ResponseBody
    	@RequestMapping(value = "uploadTest.html", method = RequestMethod.POST)
    	public Object uploadTest(MultipartFile[] files,
    						 @RequestParam(defaultValue = "") String describe,//图片描述
    						 @RequestParam(defaultValue = "1") String type) //1返回图片相对路径 2返回图片绝对路径
    	{
    		if (files == null || (files.length == 1 && files[0].getSize() == 0)){
    			return putData("图片为空");
    		}
    		Map<String, Object> map = fileUploadService.uploadTest(files,describe,type);
    
    		return map;
    
    	}
    
    }
    

    二、service层

    package com.app.service.common;
    import com.app.model.common.FileUploadEntity;
    import org.springframework.web.multipart.MultipartFile;
    
    import java.util.List;
    import java.util.Map;
    
    
    public interface FileUploadService {
    
        /**
         * 文件上传
         *
         * @Param [files 文件, type 类型, describe 描述]
         * @Author: Smily
         * @Date: 2021/2/3 14:00
         */
        Map<String, Object> uploadTest(MultipartFile[] files,String describe, String type);
    }
    

    三、文件上传实现类

    将上传的文件分日期年月日进行储存,如果是图片就储存到图片目录,文件就储存到文件目录。

    package com.app.service.common.impl;
    
    
    import java.io.File;
    import java.text.SimpleDateFormat;
    import java.util.ArrayList;
    import java.util.Date;
    import java.util.List;
    import java.util.Map;
    
    import org.apache.commons.lang3.StringUtils;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.stereotype.Service;
    import org.springframework.web.multipart.MultipartFile;
    
    import com.app.base.basecontroller.BaseController;
    import com.app.service.common.FileUploadService;
    import com.app.util.fileupload.ImageWatermarkUtil;
    
    
    /**
     * 文件/图片上传
     * @Author Smily
     * @DateTime 2021年2月3日
     */
    @Service("fileUploadService")
    public class FileUploadServiceImpl extends BaseController implements FileUploadService {
    	
    	 public static Logger logger = LoggerFactory.getLogger(FileUploadServiceImpl.class);
    
    	@Value("${httpHead}") //写自己的地址,或者文件服务器地址
    	private String httpHead;
    	
    	@Override
    	public Map<String, Object> uploadTest(MultipartFile[] files, String describe, String type) {
    		SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");
    		List<String> urlList = new ArrayList<>();
    		for (int i = 0; i < files.length; i++) {
    			MultipartFile file = files[i];
    			String saveDBPath = "";
    			if (file != null && file.getSize() > 0) {
    				String fileName = file.getOriginalFilename();
    				//根据文件类型储存在不同的文件夹下
    				String extension = getSuffix(fileName);//文件格式
    				if ((".pjpeg").equals(extension)) {//图片扩展名=转换
    					extension = ".jpeg";
    				}
    				if (StringUtils.isBlank(extension)){
    					logger.error("上传失败,未获取到文件名");
    					return putData(Boolean.FALSE, "上传失败,未获取到文件名!", null);
    				}
    				//文件存储目录
    				String datePath = new SimpleDateFormat("yyyy/MM/dd/").format(new Date());//根据日期创建不同目录
    				String folderPath = "";
    				if (isImage(extension)) {
    					folderPath = "image/" + datePath;
    				}else {
    					folderPath = "file/" + datePath;
    				}
    				String path = "/home/file_storage/" + folderPath;
    				//文件名 普通地址 命名方式:时间-数字-描述
    				String newFileName = sdf.format(new Date()) + "-" + (i + 1) + extension;
    				File targetFile = new File(path, newFileName);
    				if (!targetFile.exists()) targetFile.mkdirs();
    				try {
    					file.transferTo(targetFile);
    					//储存数据库文件名
    					if ("1".equals(type)){//相对路径
    						saveDBPath = "/fileserver/"+ folderPath + newFileName;
    					}else if ("2".equals(type)){//绝对路径
    						saveDBPath = httpHead + "/fileserver/"+ folderPath + newFileName;
    					}
    					urlList.add(saveDBPath);
    
    				} catch (Exception e) {
    					logger.error("文件上传失败", e);
    				}
    			}
    		}
    		return putData(Boolean.TRUE, "上传成功!", urlList);
    	}
    
    
    	/**
    	 * 获取文件后缀
    	 * @Author Smily
    	 * @DateTime 2020年7月15日
    	 * @param filename
    	 * @return
    	 */
    	private String getSuffix(String filename) {
    		if (StringUtils.isNotBlank(filename)){
    			String suffix = "";
    			int pos = filename.lastIndexOf('.');
    			if (pos > 0 && pos < filename.length() - 1) {
    				suffix = filename.substring(pos);
    			}
    			return suffix.toLowerCase();
    		}
    		return "";
    	}
    
    	/**
    	 * 判断文件类型
    	 * @param suffix
    	 * @Author Smily
    	 * @DateTime 2020年7月15日
    	 * @return
    	 */
    	public static boolean isImage(String suffix) {
    		suffix = suffix.toUpperCase();
    		if (".PNG".equals(suffix)
    				|| ".JPG".equals(suffix)
    				|| ".JEPG".equals(suffix)
    				|| ".JPEG".equals(suffix)
    				|| ".BMP".equals(suffix)
    				|| ".HEIC".equals(suffix)) {
    			return true;
    		}
    		return false;
    	}
    
    }
    

    这里是我上传在本地的地址
    在这里插入图片描述

    第一篇文件上传就到这里,下一篇为上传的图片增加水印信息

    展开全文
  • 这是一个普通的编码的一天,在对接一个B端提供的文件上传接口,于是使用Java中的MultipartFile对象进行处理。这时就遇到了下图的错误 二、异常处理 看异常名称就能了解到是文件过大引起的,那就需要修改默认的...

    一、 问题发现

    这是一个普通的编码的一天,在对接一个B端提供的文件上传接口,于是使用Java中的MultipartFile对象进行处理。这时就遇到了下图的错误

    二、异常处理

    看异常名称就能了解到是文件过大引起的,那就需要修改默认的文件体积设置,具体设置如下:

    spring:
      servlet:
        multipart:
          enabled: true
          max-file-size: 20MB  #单个文件最大大小
          max-request-size: 60MB #上传数据总大小

    按照上面的设置完成之后,在开发环境测试没有出现问题。本以为已经成功了,在后续的一通上线操作之后,发现线上前端仍然是显示上传失败。

    三、nginx设置

    配合线上Java日志发现并没有任何报错信息,于是查看请求状态码,发现是413状态码(413 Request Entity Too Large),请求实体过大,那么这一层应该是在nginx接受到请求时,出现的问题。

    由此推测,需要在nginx中进行设置,百度查询了一下,需要设置

    client_max_body_size 60m;    #60可根据具体需求具体设置,但不能大于上述java中设置的max-request-size的值
    

    且这个属性可以在http{},server{},location{},这3个位置设置,对应不同的作用区间。

    在/usr/local/nginx/conf/nginx.conf这个nginx配置文件中加上client_max_body_size 60m。

    后续重启nginx(注意:nginx -s reload不行),网上有几个比较常用的重启方式,

    service nginx restart

    systemctl start nginx

    上述的2种方式需要对nginx进行一些配置,我没有使用

    四、nginx操作

    1、cd   /usr/local/nginx/sbin  //切到nginx启动目录下

    2、ps -ef|grep nginx       //查看nginx 的运行进程

    3、kill -QUIT 主进程号    //杀死nginx的主进程号

    4、./nginx      //启动nginx,如需要指向其他nginx配置 ./nginx -c 自定义配置路径

     

     

    展开全文
  • 文件上传MultipartFile

    2018-12-15 09:43:24
    本次带来的是MultipartFile文件文件上传,可以在sql执行完成,没有出现异常,再将文件保存进我们的服务器,如果出现异常,文件不会上传到我们的服务器
  • 最近遇到一个这样的需求...1、MultipartFile上传文件 文件上传有很多方法,这里推荐一种,代码: @PostMapping(value = "/import", headers = "content-type=multipart/*") public HttpResponseimportSqlLite(@...

    最近遇到一个这样的需求:传一个压缩包给后台,后台保存后解压读取里面的文件。在这里做个记录

    1、MultipartFile上传文件

    文件上传有很多方法,这里推荐一种,代码:

     @PostMapping(value = "/import", headers = "content-type=multipart/*")

        public HttpResponse importSqlLite(@RequestParam("file") MultipartFile file) {
                String path = "C:/filePath/";

                File newFile = new File(path + file.getOriginalFilename())

                file.transferTo(newFile);

                return HttpResponse;
        }

     

    2、JDK内置操作Zip文件


    其实,在JDK中已经存在操作ZIP的工具类:ZipInputStream

     

    基本使用:

    例子1:

        public static Map<String, String> readZipFile(String file) throws Exception {
            Map<String, String> resultMap = new HashMap<String, String>();
            Charset gbk = Charset.forName("GBK");
            ZipFile zf = new ZipFile(file, gbk);  // 此处可以用无Charset的构造函数,但是即使是设置为GBK也是处理不了中文的,后面会再说
            InputStream in = new BufferedInputStream(new FileInputStream(file));  
            ZipInputStream zin = new ZipInputStream(in);  
            ZipEntry ze;
            
            while ((ze = zin.getNextEntry()) != null) {  
                if (ze.isDirectory()) {
                } else {  
                    long size = ze.getSize();    // 文件的大小
                    String name = ze.getName();    // 获取文件名称
                    // 具体对其中每个文件的操作和获取信息,可以参考JDK API
                    if (size > 0) {
                        InputStream inputStream = zf.getInputStream(ze);    // 拿到文件流
                        // ……    业务逻辑
                    }
                }  
            }  
            zin.closeEntry();
            
            return resultMap;
        }

     

    例子2:

    public class FileUtils {  
      
        //日志  
        private static final Logger LOGGER = LoggerFactory.getLogger(FileUtils.class);  
          
        /** 
        * 对zip类型的文件进行解压 
        */  
        public static List<FileModel> unzip(MultipartFile file) {  
            // 判断文件是否为zip文件  
            String filename = file.getOriginalFilename();  
            if (!filename.endsWith("zip")) {  
                LOGGER.info("传入文件格式不是zip文件" + filename);  
                new BusinessException("传入文件格式错误" + filename);  
            }  
            List<FileModel> fileModelList = new ArrayList<FileModel>();  
            String zipFileName = null;  
            // 对文件进行解析  
            try {  
                ZipInputStream zipInputStream = new ZipInputStream(file.getInputStream(), Charset.forName("GBK"));  
                BufferedInputStream bs = new BufferedInputStream(zipInputStream);  
                ZipEntry zipEntry;  
                byte[] bytes = null;  
                while ((zipEntry = zipInputStream.getNextEntry()) != null) { // 获取zip包中的每一个zip file entry  
                    zipFileName = zipEntry.getName();  
                    Assert.notNull(zipFileName, "压缩文件中子文件的名字格式不正确");  
                    FileModel fileModel = new FileModel();  
                    fileModel.setFileName(zipFileName);  
                    bytes = new byte[(int) zipEntry.getSize()];  
                    bs.read(bytes, 0, (int) zipEntry.getSize());  
                    InputStream byteArrayInputStream = new ByteArrayInputStream(bytes);  
                    fileModel.setFileInputstream(byteArrayInputStream);  
                    fileModelList.add(fileModel);  
                }  
            } catch (Exception e) {  
                LOGGER.error("读取部署包文件内容失败,请确认部署包格式正确:" + zipFileName, e);  
                new BusinessException("读取部署包文件内容失败,请确认部署包格式正确:" + zipFileName);  
            }  
            return fileModelList;  
        }  
    }  



    更多的操作可以参考其他人的总结,本文的重点在于描述JDK自带zip操作API的不便之处,从而引出Zip4J。

    JDK自带ZIP API有个非常重大的问题:不支持ZIP中目录中的中文。如下异常:

    java.lang.IllegalArgumentException: MALFORMED
        at java.util.zip.ZipCoder.toString(Unknown Source)
        at java.util.zip.ZipInputStream.readLOC(Unknown Source)
        at java.util.zip.ZipInputStream.getNextEntry(Unknown Source)
        at com.mskj.test.md5.BigFileMD5.readZipFile(BigFileMD5.java:131)
        at com.mskj.test.md5.BigFileMD5.checkFileMD5(BigFileMD5.java:42)
        at com.mskj.test.TestMain.main(TestMain.java:12)

    我的ZIP中目录:“Test\Test-01\Te\你好\……”,当然导致该异常的原因不只是中文的问题,但是大部分情况下都是。对于JDK自带的ZIP API还有一些其他问题,比如操作解压和压缩API接口不方便(带有密码ZIP)等。当然,网上有许多人说是已经可以解决中文的问题,但是比较麻烦,并不是每次都能够成功,我本地也有尝试过。

    在我们的项目中,通过不断的比较,最终还是选择了ZIP4J。

    3、ZIP4J


    官网:http://www.lingala.net/zip4j.html

    mvn库:https://mvnrepository.com/artifact/net.lingala.zip4j/zip4j

    目前最新版本是2.3.1,配置如下:

    <!-- https://mvnrepository.com/artifact/net.lingala.zip4j/zip4j -->
    <dependency>
        <groupId>net.lingala.zip4j</groupId>
        <artifactId>zip4j</artifactId>
        <version>2.3.1</version>
    </dependency>

     

          zip4j默认采用的是UTF-8编码,所以本身支持中文(但是,个人建议还是在读取zip文件后,立即设置字符集),同时也支持密码,而且支持多种压缩算法,可以说功能强大,但使用起来却非常简单,当然,如果有其他需求,需要自己从官网上看API。如果你百度或者谷歌ZIP4J的用法,会有许多好的博客和教程,再此不再赘述。
    例如:
    https://blog.csdn.net/ditto_zhou/article/details/82977395
    https://www.cnblogs.com/622698abc/p/3389855.html
    https://www.iteye.com/blog/rensanning-1836727
    ……

     

    4、不解压zip文件,直接通过InputStream的形式读取其中的文件信息

           我想结合一下我项目中需求以及网上许多同仁的问题(不解压zip文件,直接通过InputStream的形式读取其中的文件信息),说一个简单的应用:不解压ZIP文件的前提下,直接利用流(InuptStream)形式读取其中的文件,并读取文件的MD5值。

    类似于JDK自带ZipInputStream的形式读取zip文件,由于ZIP4J的ZipInputStream不具备ZipInputStream.getNextEntry()),所以,在ZIP4J中只能通过FileHeader来进行循环。而且,JDK自带API中获取ZIP其中的文件流InputStream时,需要:

    ZipFile zf = new ZipFile(file);
    InputStream inputStream = zf.getInputStream(ZipEntry);

    所以,对应ZIP4J就只能ZipInputStream(该类时InputStream的子类)。

    具体代码如下:

    import java.util.List;
    import net.lingala.zip4j.core.ZipFile;
    import net.lingala.zip4j.io.ZipInputStream;
    import net.lingala.zip4j.model.FileHeader;

    public class ZIP4JUtils {
        /**
         * @param file
         * @throws Exception
         */
        public static void readZipFileMD5ByZip4J(String file,String  passwd) throws Exception {
            file.replaceAll("\\\\", "/");
            ZipFile zFile = new ZipFile(file);
            // 此处最好立即设置字符集
            zFile.setFileNameCharset("GBK");
            if (!zFile.isValidZipFile()) {
                return ;
            }
            if (zFile.isEncrypted()) {
                zFile.setPassword(passwd.toCharArray());
            }


            // 获取ZIP中所有文件的FileHeader,以便后面对zip中文件进行遍历
            List<FileHeader> list = zFile.getFileHeaders();
            // 此时list的size包括:文件夹、子文件夹、文件的个数
            System.out.println(list.size());
            // 遍历其中的文件
            for (FileHeader fileHeader : list) {
                String fileName = fileHeader.getFileName();
                // fileName会将目录单独读出来,而且带有路径分割符

                 if (fileHeader.isDirectory()) {
                 //if (fileName.endsWith("/") || fileName.endsWith("\\\\") || fileName.endsWith("\\")) {
                    System.out.println(fileName + " 这是一个文件夹。");
                    continue;
                }else {
                    ZipInputStream inputStream = zFile.getInputStream(fileHeader);
                    

                    //下面就可以获取或者保存ZipInputStream,转换为标准InputStream后获取文件内容。

                    String Md5String = BigFileMD5.getStreamMD5(inputStream);
                    System.out.println(fileName + " 这是一个文件,该文件的MD5值:" + Md5String);
                }
            }
        }
    }

    其中计算MD5值的类如下:

    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.IOException;
    import java.io.InputStream;
    import java.security.MessageDigest;
    import java.security.NoSuchAlgorithmException;
    import java.util.ArrayList;
    import java.util.List;
    import org.apache.commons.codec.binary.Hex;
     
    public class BigFileMD5 {
        static MessageDigest MD5 = null;
        static List<File> list = new ArrayList<File>();
        static{
            try{
                MD5 = MessageDigest.getInstance("MD5");
            }catch(NoSuchAlgorithmException e){
                e.printStackTrace();
            }
        }
        
        /**
         * 对一个文件获取md5值
         * @return md5串
         */
        public static String getStreamMD5(InputStream fileInputStream) {
            try {
                byte[] buffer = new byte[8192];
                int length;
                while ((length = fileInputStream.read(buffer)) != -1) {
                    MD5.update(buffer, 0, length);
                }
     
                return new String(Hex.encodeHex(MD5.digest()));
            } catch (FileNotFoundException e) {
            e.printStackTrace();
                return null;
            } catch (IOException e) {
            e.printStackTrace();
                return null;
            } finally {
                try {
                    if (fileInputStream != null)
                    fileInputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        
        /**
         * 对一个文件获取md5值
         * @return md5串
         */
        public static String getMD5(File file) {
            FileInputStream fileInputStream = null;
            try {
                fileInputStream = new FileInputStream(file);
                byte[] buffer = new byte[8192];
                int length;
                while ((length = fileInputStream.read(buffer)) != -1) {
                    MD5.update(buffer, 0, length);
                }
     
                return new String(Hex.encodeHex(MD5.digest()));
            } catch (FileNotFoundException e) {
            e.printStackTrace();
                return null;
            } catch (IOException e) {
            e.printStackTrace();
                return null;
            } finally {
                try {
                    if (fileInputStream != null)
                    fileInputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    输出结果:

    Test-01/ 这是一个文件夹。
    Test-01/BigFielMD5.jar 这是一个文件,该文件的MD5值:db55e6677f7087754f11eaf84b2d728e
    Test-01/Te/ 这是一个文件夹。
    Test-01/Te/Test.txt 这是一个文件,该文件的MD5值:c6354a0eb36fac331c138eec7a4826ef
    Test-01/Te/你好/ 这是一个文件夹。
    Test-01/Te/你好/Hello/ 这是一个文件夹。
    Test-01/Te/你好/Hello/antlr-2.7.2.jar 这是一个文件,该文件的MD5值:a73459120df5cadf75eaa98453433a01
    Test-01/Te/你好/Hello/antlr-2.7.2.jar.sha1 这是一个文件,该文件的MD5值:3aa5bc052867b339a0b6ed0546f9b336
    Test-01/Te/你好/Hello/antlr-2.7.2.pom 这是一个文件,该文件的MD5值:b1136da0c12ce8ffc18d00f8742256ee
    Test-01/Te/你好/Hello/antlr-2.7.2.pom.sha1 这是一个文件,该文件的MD5值:ebd38323fc24c8aab361b2a7660ec666
    Test-01/测试.txt 这是一个文件,该文件的MD5值:0b60aa5d9aa241ca6063495086e38e95

    这样就实现了,Java不解压直接读取zip文件和文件内容(InputStream的形式)。
     

    5、自定义一个unzip接口

     

    /** 
         * 使用给定密码解压指定的ZIP压缩文件到指定目录 
         * <p> 
         * 如果指定目录不存在,可以自动创建,不合法的路径将导致异常被抛出 
         * @param zip 指定的ZIP压缩文件 
         * @param dest 解压目录 
         * @param passwd ZIP文件的密码 
         * @return  解压后文件数组 
         * @throws ZipException 压缩文件有损坏或者解压缩失败抛出 
         */  
        public static File [] unzip(File zipFile, String dest, String passwd) throws ZipException {  
            ZipFile zFile = new ZipFile(zipFile);  
            zFile.setFileNameCharset("GBK");  
            if (!zFile.isValidZipFile()) {  
                throw new ZipException("压缩文件不合法,可能被损坏.");  
            }  
            File destDir = new File(dest);  
            if (destDir.isDirectory() && !destDir.exists()) {  
                destDir.mkdir();  
            }  
            if (zFile.isEncrypted()) {  
                zFile.setPassword(passwd.toCharArray());  
            }  
            zFile.extractAll(dest);  
              
            List<FileHeader> headerList = zFile.getFileHeaders();  
            List<File> extractedFileList = new ArrayList<File>();  
            for(FileHeader fileHeader : headerList) {  
                if (!fileHeader.isDirectory()) {  
                    extractedFileList.add(new File(destDir,fileHeader.getFileName()));  
                }  
            }  
            File [] extractedFiles = new File[extractedFileList.size()];  
            extractedFileList.toArray(extractedFiles);  
            return extractedFiles;  
        }  

    -------------------或者----------------------------------

    //解压路径
        private String dest = "C:\\Users\\aaa\\Desktop\\新建文件夹";
        //解压后图片保存的路径
        private String picPath = "C:/Users/aaa/Desktop/新建文件夹/pic";


        public String Uncompress(String source) {
            List<String> picPaths = new ArrayList<>();
            try {
                File zipFile = new File(source);
                ZipFile zFile = new ZipFile(zipFile);// 首先创建ZipFile指向磁盘上的.zip文件

                zFile.setFileNameCharset("GBK");

                File destDir = new File(dest);// 解压目录 
                zFile.extractAll(dest);// 将文件抽出到解压目录
                  if (zFile.isEncrypted()) {   
                      zFile.setPassword(password.toCharArray());  // 设置密码   
                  }
                  zFile.extractAll(dest);      // 将文件抽出到解压目录(解压)   
         
                 List<net.lingala.zip4j.model.FileHeader > headerList = zFile.getFileHeaders(); 
                  List<File> extractedFileList= newArrayList<File>(); 
                  for(FileHeader fileHeader : headerList) { 
                      if (!fileHeader.isDirectory()) { 
                          extractedFileList.add(new File(destDir,fileHeader.getFileName())); 
                      } 
                  } 
                  File [] extractedFiles = new File[extractedFileList.size()]; 
                 extractedFileList.toArray(extractedFiles); 
                  for(File f:extractedFileList){
                    System.out.println(f.getAbsolutePath()+"....");
                  }

          }catch(ZipException e) {
          } 

     

    7.另外上传文件,下载文件

     

    1. 上传文件(且保存到i数据库中)
    @PostMapping("upload")
        public String upload(MultipartFile aaa, HttpSession session) throws IOException {
            //获取上传文件用户id
            User user = (User) session.getAttribute("user");
            //获取文件原始名称
            String oldFileName = aaa.getOriginalFilename();
            //获取文件后缀
            String extension = "." + FilenameUtils.getExtension(aaa.getOriginalFilename());
            //生成新的文件名称
            String newFileName = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date()) + UUID.randomUUID().toString().replace("-", "") + extension;
            //文件大小
            Long size = aaa.getSize();
            //文件类型
            String type = aaa.getContentType();
            //处理根据日期生成目录
            //String realPath = ResourceUtils.getURL("classpath:").getPath() + "/static/files";
            String dateFormat = new SimpleDateFormat("yyyy-MM-dd").format(new Date());
            String dateDirPath = uploadPath + "/files/" + dateFormat;
            File dateDir = new File(dateDirPath);
            if (!dateDir.exists()) dateDir.mkdirs();
            //处理文件上传
            aaa.transferTo(new File(dateDir, newFileName));
            //将文件信息放入数据库保存
            UserFile userFile = new UserFile();
            userFile.setOldFileName(oldFileName).setNewFileName(newFileName).setExt(extension).setSize(String.valueOf(size))
                    .setType(type).setPath("/files/" + dateFormat).setUserId(user.getId());
            userFileService.save(userFile);
            return "redirect:/file/showAll";
        }
    复制代码
    1. 下载文件(在线预览)
    @GetMapping("download")
        public void download(String openStyle, String id, HttpServletResponse response) throws IOException {
            //获取打开方式
            openStyle = openStyle == null ? "attachment" : openStyle;
            //获取文件信息
            UserFile userFile = userFileService.findById(id);
            //点击下载链接更新下载次数
            if ("attachment".equals(openStyle)) {
                userFile.setDowncounts(userFile.getDowncounts() + 1);
                userFileService.update(userFile);
            }
            //根据文件信息中文件名字 和 文件存储路径获取文件输入流
            String realpath = ResourceUtils.getURL("classpath:").getPath() + "/static" + userFile.getPath();
            //获取文件输入流
            FileInputStream is = new FileInputStream(new File(realpath, userFile.getNewFileName()));
            //附件下载
            response.setHeader("content-disposition", openStyle + ";fileName=" + URLEncoder.encode(userFile.getOldFileName(), "UTF-8"));
            //获取响应输出流
            ServletOutputStream os = response.getOutputStream();
            //文件拷贝
            IOUtils.copy(is, os);
            IOUtils.closeQuietly(is);
            IOUtils.closeQuietly(os);
        }

     

    7、参考

    https://blog.csdn.net/huxiutao/article/details/90411113

    https://juejin.cn/post/6844904135985217549

     

    请我喝咖啡

    如果觉得文章写得不错,能对你有帮助,可以扫描我的微信二维码请我喝咖啡哦~~哈哈~~

     

    展开全文
  • 主要为大家详细介绍了Java原生服务器接收上传文件,不使用MultipartFile类,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • java POI 通过MultipartFileExcel文件解析写入数据库
  • java通过MultipartFile进行文件、图片上传和下载,以及文件流 package com.fh.controller; import com.fh.util.UuidUtil; import org.apache.commons.io.IOUtils; import org.apache.ibatis.javassist.tools....
  • java MultipartFile Postman上传文件

    千次阅读 2019-06-03 14:52:13
    这里使用postman调试MultipartFile上传图片 不需要设置headers 设置Body,在value框选择图片。发送请求就ok,这里还有图片大小与后台设置 返回数据,可以直接连接访问图片 ...
  • 参考了大佬的链接 :... java 使用MultipartFile上传文件,如果不是用form表单提交的话,直接获取文件使用无法传参成功 var files = $("#file"); $.ajax({ url: prefix + "/hdfsUploadFiles",...
  • // 选择用缓冲区来实现这个转换即使用java 创建的临时文件 使用 MultipartFile.transferto()方法 private File transferToFile(MultipartFile multipartFile) { File file = null; try { String ...
  • 到处找每个人写的都不一样,很多都不适合要求,前端框架关键给我坑的一笔啊。... js接收文件  var formData = new FormData();  formData.append("files", $("#file1")[0].file
  • 这个方法好像只能向本地传递文件。 远程方法有待后期更新。 @RequestMapping("/uploadFile") @ResponseBody public void uploadFile(@RequestParam("file")MultipartFile multipartFile, String odd_number){ if...
  • 2 * 上传图片到服务器 并压缩 3 * 4 * @param myFile 文件 5 * @param request 6 * @return 7 */ 8 private Boolean UploadFile(MultipartFile myFile, int width, int height, HttpServletRequest request) ...
  • Java中利用MultipartFile实现文件上传

    万次阅读 2017-01-08 17:25:10
    JavaWeb项目页面实现文件上传功能 jsp文件增加文件上传控件,可以放在form表单内,增加隐藏域保存上传路径提交到后台。 正在上传,请稍后...
  • 在上一篇我们已经实现了文件上传,那么如果对于图片的上传,我们要给图片加上我们需要的水印信息,比如图片的上传人,上传地点等信息,此时我们为上传功能再新增水印功能。 最终上传效果如图所示 一、前端上传至...
  • // 将上传文件写入文件系统 void transferTo(File var1) throws IOException, IllegalStateException; // 写入指定path default void transferTo(Path dest) throws IOException, IllegalStateException { ...
  • 今天的积累都是为了更好的明天,加油!我是java程序员,大家可以关注我一起学习哈! /** * 判断文件大小 * * @param len * 文件长度 * @param size * 限制大小 * @param unit * 限制单位(B,K,...
  • 接收不到文件的写法 var files = document.getElementById('myFile').files;...@RequestParam("file")MultipartFile[] file file始终是获取不到文件的 正确写法 for(i=0; i < files.length; i++){ formData.a
  • public void demo1(HttpServletRequest request,HttpServletResponse response) throws Exception { MultipartHttpServletRequest multipartMap = ...String, MultipartFile> fileMap = multipartMap.getFileMa...
  • Java 文件上传 MultipartFile

    万次阅读 2017-11-01 09:06:20
    Java 文件上传 MultipartFile 1. 配置MultipartResolver:用于处理表单中的file p:defau
  • 第二个action用来接收上传文件,然后写入服务端本地文件,最后返回带有成功标志的json串。 前端代码如下: <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <!DOCTYPE html> ...
  • 这里就只做了图片判断,...文件后缀名枚举 //文件类型 public static String IMG_TYPE_PNG = "PNG"; public static String IMG_TYPE_JPG = "JPG"; public static String IMG_TYPE_JPEG = "JPEG"; public stati...
  • multipartfile上传文件 大小限制

    千次阅读 2020-09-27 13:32:07
    关于文件上传大小 主要看一个错误 org.apache.tomcat.util.http.fileupload.impl.SizeLimitExceededException: the request was rejected because its size (59500387) exceeds the configured maximum (10485760) ...
  • * 上传MP4格式视频 */ @RequestMapping("/VideoMps4") @ResponseBody public Object VideoMps4(@RequestParam MultipartFile file) { try { String fileName = file.getOriginalFilename(); if (fileNam
  • JAVA获取MultipartFile文件的MD5

    千次阅读 2020-07-16 14:00:25
    JAVA获取MultipartFile文件的MD5 Java获取文件的MD5,核心都是通过JAVA自带的MessageDigest类来实现。获取文件MD5值主要分为三个步骤,第一步获取文件的byte信息,第二步通过MessageDigest类进行MD5加密,第三步...
  • 近日,项目中有个需求-android端上传一个商品多张图片,需要java后台。以前后台使用了struts,现在是springmvc。想着很多东西是不是能优化一下,正好重新写一下。 android端有时间再记录一下  后台环境是win10+...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 30,353
精华内容 12,141
关键字:

javamultipartfile上传文件

java 订阅