最近一个类似需求,奈何我都没做过二进制转文件的,头发都抓秃了,网上找到的都尝试失败了,还好大道三千遁去其一,终归不能让乌云遮住我的双眼…(以下省略一万字!)
这是我本地测试案例,大家可以试一下
package com.huayue.cloud.veteran.rightsInterestsProtection.service.impl;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Paths;
public class TestUtil {
public static void main(String[] args) throws IOException {
byte[] fileContent = Files.readAllBytes(Paths.get("D:\\myFolder\\pdf测试2.txt"));
String base64String = new String(fileContent, StandardCharsets.UTF_8); // 假设文件是UTF-8编码
// 将十六进制字符串转换为字节数组
byte[] binaryData = binaryStringToByteArray(base64String);
// 指定文件路径和文件名,例如 D:\myFolder\myfile.bin
String filePath = "D:\\myFolder\\pdf测试2.pdf";
// 确保目录存在,如果不存在则创建它
java.nio.file.Files.createDirectories(java.nio.file.Paths.get(filePath).getParent());
// 将字节数组写入文件
try (FileOutputStream fos = new FileOutputStream(filePath)) {
fos.write(binaryData);
System.out.println("文件已成功写入到 " + filePath);
} catch (IOException e) {
e.printStackTrace();
System.err.println("写入文件时发生错误:" + e.getMessage());
}
}
/**
* 将二进制字符串转换为字节数组
* @param binaryString 由'0'和'1'组成的二进制字符串
* @return 转换后的字节数组
* @throws IllegalArgumentException 如果二进制字符串的长度不是8的倍数
*/
public static byte[] binaryStringToByteArray(String binaryString) throws IllegalArgumentException {
if (binaryString.length() % 8 != 0) {
throw new IllegalArgumentException("二进制字符串的长度必须是8的倍数");
}
byte[] byteArray = new byte[binaryString.length() / 8];
for (int i = 0; i < binaryString.length(); i += 8) {
String byteStr = binaryString.substring(i, i + 8);
byteArray[i / 8] = (byte) Integer.parseInt(byteStr, 2);
}
return byteArray;
}
}
**当然这只是一个本地测试案例,重点是我要怎么转成MultipartFile类型
**
- 首先,咱要把二进制字符串转成MultipartFile是没有直接转的方法,所以先转成byet[]数组
/**
* 将二进制字符串转换为字节数组
* @param binaryString 由'0'和'1'组成的二进制字符串
* @return 转换后的字节数组
* @throws IllegalArgumentException 如果二进制字符串的长度不是8的倍数
*/
public static byte[] binaryStringToByteArray(String binaryString) throws IllegalArgumentException {
if (binaryString.length() % 8 != 0) {
throw new IllegalArgumentException("二进制字符串的长度必须是8的倍数");
}
byte[] byteArray = new byte[binaryString.length() / 8];
for (int i = 0; i < binaryString.length(); i += 8) {
String byteStr = binaryString.substring(i, i + 8);
byteArray[i / 8] = (byte) Integer.parseInt(byteStr, 2);
}
return byteArray;
}
- 然后再转成文件流,这个就好转了,咱直接转
InputStream inputStream = new ByteArrayInputStream(byteArray);
- 再然后想把文件流转成MultipartFile类型,这里有个坑,不能直接new MockMultipartFile,需要获取feign对multipartFile的封装
/**
* 获取封装得MultipartFile
*
* @param inputStream inputStream
* @param fileName fileName
* @return MultipartFile
*/
public static MultipartFile getMultipartFile(InputStream inputStream, String fileName) throws Exception{
FileItem fileItem = createFileItem(inputStream, fileName);
//CommonsMultipartFile是feign对multipartFile的封装,但是要FileItem类对象
return new CommonsMultipartFile(fileItem);
}
/**
* FileItem类对象创建
*
* @param inputStream inputStream
* @param fileName fileName
* @return FileItem
*/
public static FileItem createFileItem(InputStream inputStream, String fileName) throws Exception{
FileItemFactory factory = new DiskFileItemFactory(16, null);
String textFieldName = "file";
FileItem item = factory.createItem(textFieldName, MediaType.MULTIPART_FORM_DATA_VALUE, true, fileName);
int bytesRead = 0;
byte[] buffer = new byte[10 * 1024 * 1024];
OutputStream os = null;
//使用输出流输出输入流的字节
try {
os = item.getOutputStream();
while ((bytesRead = inputStream.read(buffer, 0, 8192)) != -1) {
os.write(buffer, 0, bytesRead);
}
inputStream.close();
} catch (IOException e) {
throw new IllegalArgumentException("文件上传失败");
} finally {
if (os != null) {
try {
os.close();
} catch (IOException e) {
throw new Exception("Stream close exception", e);
}
}
if (inputStream != null) {
try {
inputStream.close();
} catch (IOException e) {
throw new Exception("Stream close exception", e);
}
}
}
return item;
}
这样我们就得到了MultipartFile 文件类型,皆大欢喜!
帮忙关注点赞加收藏撒~