Java MultipartFile实现文件上传(一)

使用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;
	}

}

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

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

  • 8
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
Java 中的 MultipartFile 接口用于对文件进行操作,实现文件上传。 以下是一个简单的文件上传示例,其中包含一个 HTML 表单和一个 SpringMVC 的控制器: HTML 表单: ```html <!DOCTYPE html> <html> <head> <title>文件上传</title> </head> <body> <h2>文件上传</h2> <form action="http://localhost:8080/upload" method="POST" enctype="multipart/form-data"> <input type="file" name="file" /> <br /><br /> <input type="submit" value="上传" /> </form> </body> </html> ``` SpringMVC 控制器: ```java @Controller public class FileUploadController { @PostMapping("/upload") public ResponseEntity<String> handleFileUpload(@RequestParam("file") MultipartFile file) { String fileName = StringUtils.cleanPath(file.getOriginalFilename()); try { if (file.isEmpty()) { throw new FileNotFoundException("请上传文件!"); } if (fileName.contains("..")) { throw new FileNotFoundException("文件名无效!"); } // 将文件保存到本地磁盘 Path path = Paths.get("/path/to/save/" + fileName); Files.copy(file.getInputStream(), path, StandardCopyOption.REPLACE_EXISTING); } catch (IOException e) { return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(e.getMessage()); } return ResponseEntity.ok().body("文件上传成功!"); } } ``` 在控制器中,使用 `@RequestParam` 注解获取 `file` 参数,并使用 `MultipartFile` 对象进行操作。在 `handleFileUpload` 方法中,首先检查文件是否存在以及文件名是否有效。然后,使用 `Files.copy` 方法将文件保存到本地磁盘。 注意:本示例中的保存路径为 `/path/to/save/`,需要替换为实际的保存路径。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值