java-把File转成MultipartFile

本文介绍了一种将本地文件路径转换为MultipartFile的方法,适用于Java Spring Boot框架中处理文件上传的需求。通过创建FileItem并封装为CommonsMultipartFile,实现了从文件路径到MultipartFile的转换,便于进行文件上传操作。
	// 把File转成MultipartFile
	private static MultipartFile getMulFileByPath(String picPath) {
		FileItem fileItem = createFileItem(picPath);
		MultipartFile mfile = new CommonsMultipartFile(fileItem);
		return mfile;
	}

	private static FileItem createFileItem(String filePath) {
		FileItemFactory factory = new DiskFileItemFactory(16, null);
		String textFieldName = "textField";
		int num = filePath.lastIndexOf(".");
		String extFile = filePath.substring(num);
		FileItem item = factory.createItem(textFieldName, "text/plain", true, "MyFileName" + extFile);
		File newfile = new File(filePath);
		int bytesRead = 0;
		byte[] buffer = new byte[8192];
		try {
			FileInputStream fis = new FileInputStream(newfile);
			OutputStream os = item.getOutputStream();
			while ((bytesRead = fis.read(buffer, 0, 8192)) != -1) {
				os.write(buffer, 0, bytesRead);
			}
			os.close();
			fis.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return item;
	}

	// 测试
	@PostMapping("/testtest")
	public String testtest(@RequestParam("path") String path) throws FileNotFoundException {

		MultipartFile multipartFile = getMulFileByPath(path);

		String fullpath = "C:\\Users\\jiangyafen\\Desktop\\imageTest\\test";
		// 保存图片
		try {
			// MultipartFile转byte
			byte[] img = multipartFile.getBytes();

			File file = new File(fullpath);
			if (!file.getParentFile().exists()) {
				file.getParentFile().mkdirs();
			}
			FileImageOutputStream imageOutput = new FileImageOutputStream(file);
			imageOutput.write(img, 0, img.length);
			Thumbnails.of(file).scale(0.5).toFile(fullpath);
			imageOutput.close();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			throw new AppBizException(e.getLocalizedMessage());
		}

		return "scuess";
	}
### Java 中将 File 对象转换为 MultipartFile 的方法 在 Java 开发中,`MultipartFile` 是 Spring 提供的一个接口,用于处理上传的文件数据。由于 `MultipartFile` 并不是一个具体的实现类,因此无法直接实例化它。为了将普通的 `File` 对象转化为 `MultipartFile`,可以借助一些工具类来完成这一操作。 以下是通过自定义方式实现 `File` 到 `MultipartFile` 转换的具体代码: #### 方法一:基于 `MockMultipartFile` Spring 提供了一个名为 `MockMultipartFile` 的类,可以直接用来模拟创建一个 `MultipartFile` 实例。此方法适用于测试环境或其他不需要实际保存文件的情况。 ```java import org.springframework.mock.web.MockMultipartFile; import java.io.File; import java.io.FileInputStream; import java.io.IOException; public class FileUtils { public static MultipartFile convert(File file) throws IOException { FileInputStream input = new FileInputStream(file); MultipartFile multipartFile = new MockMultipartFile( "file", file.getName(), "application/octet-stream", // MIME 类型可以根据实际情况调整 input ); return multipartFile; } } ``` 上述代码实现了从 `File` 到 `MultipartFile` 的转换过程[^1]。需要注意的是,在调用该函数时应确保输入的 `File` 存在于磁盘上,并且具有可读权限。 #### 方法二:利用 Apache Commons FileUpload 组件 除了使用 Spring 自带的 `MockMultipartFile` 外,还可以采用第三方库——Apache Commons FileUpload 来构建类似的逻辑。这种方法更加灵活,适合生产环境中复杂的业务需求。 ```java import org.apache.commons.fileupload.disk.DiskFileItem; import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.commons.CommonsMultipartFile; import java.io.*; public class FileUtils { public static MultipartFile getMulFileByPath(String filePath) { File sourceFile = new File(filePath); DiskFileItem diskFileItem = new DiskFileItem("textField", "application/octet-stream", false, sourceFile.getName(), (int)sourceFile.length(), null); try (InputStream inputStream = new FileInputStream(sourceFile); OutputStream outputStream = diskFileItem.getOutputStream()) { byte[] buffer = new byte[8192]; int bytesRead; while ((bytesRead = inputStream.read(buffer)) != -1) { outputStream.write(buffer, 0, bytesRead); } } catch (FileNotFoundException e) { throw new RuntimeException(e.getMessage()); } catch (IOException e) { throw new RuntimeException(e.getMessage()); } return new CommonsMultipartFile(diskFileItem); } } ``` 这段代码展示了另一种实现思路,即通过手动流拷贝的方式将原始文件的内容写入到一个新的临时存储区域中去[^
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值