java二进制字符串接收转文件流上传

最近一个类似需求,奈何我都没做过二进制转文件的,头发都抓秃了,网上找到的都尝试失败了,还好大道三千遁去其一,终归不能让乌云遮住我的双眼…(以下省略一万字!)

这是我本地测试案例,大家可以试一下

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类型
**

  1. 首先,咱要把二进制字符串转成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;
    }
  1. 然后再转成文件流,这个就好转了,咱直接转
InputStream inputStream = new ByteArrayInputStream(byteArray);
  1. 再然后想把文件流转成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 文件类型,皆大欢喜!

帮忙关注点赞加收藏撒~

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值