带你领略IO的魅力——File与MultipartFile的相互转换

什么是MultipartFile?

     MultipartFile是spring类型,代表HTML中form data方式上传的文件,包含二进制数据+文件名称。

什么是File?

  1. File类主要是JAVA为文件这块的操作(如删除、新增等)而设计的相关类

  2. File类的包名是java.io,其实现了Serializable, Comparable两大接口以便于其对象可序列化和比较

核心思想:管子的套接

MultipartFile 如何转 File ?

 /**
     * MultipartFile 转 File
     *
     * @param file
     * @throws Exception
     */
    private static File multipartFileToFile(MultipartFile file) throws Exception {

        File toFile = null;
        if (file == null || file.getSize() <= 0) {
            return null;
        } else {
            InputStream ins = null;
            ins = file.getInputStream();
            toFile = new File(Objects.requireNonNull(file.getOriginalFilename()));
            inputStreamToFile(ins, toFile);
            ins.close();
        }
        return toFile;
    }

File 如何转 MultipartFile ?

/**
     * File 转 MultipartFile
     * @param file
     * @return
     */
    private MultipartFile createMultipartFile(File file) {
        try {
            FileItem fileItem = null;
            MultipartFile multipartFile = null;
            fileItem = new DiskFileItem(file.getName(), Files.probeContentType(file.toPath()),
                    false, file.getName(), (int) file.length(), file.getParentFile());
            InputStream input = new FileInputStream(file);
            OutputStream os = fileItem.getOutputStream();
            IOUtils.copy(input, os);
            multipartFile = new CommonsMultipartFile(fileItem);
            os.close();
            input.close();
            return multipartFile;
        } catch (Exception e) {
          e.getStackTrace();
          throw new RuntimeException("File转MultipartFile失败");
        }
    }

如何通过url获取文件实体呢?

1、通过url获取文件流—>获取字节数据—>获取临时文件

 /**
     * 根据地址获得数据的字节流
     *
     * @param strUrl
     *            网络连接地址
     * @return
     */
    private static byte[] getImageFromNetByUrl(String strUrl) {
        try {
            URL url = new URL(strUrl);
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setRequestMethod("GET");
            conn.setConnectTimeout(5 * 1000);
            // 通过输入流获取图片数据
            InputStream inStream = conn.getInputStream();
            // 得到图片的二进制数据
            byte[] btImg = readInputStream(inStream);
            return btImg;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
 /**
     * 从输入流中获取数据
     *
     * @param inStream
     *            输入流
     * @return
     * @throws Exception
     */
    private static byte[] readInputStream(InputStream inStream) throws Exception {
        ByteArrayOutputStream outStream = new ByteArrayOutputStream();
        byte[] buffer = new byte[1024];
        int len = 0;
        while ((len = inStream.read(buffer)) != -1) {
            outStream.write(buffer, 0, len);
        }
        inStream.close();
        return outStream.toByteArray();
    }
  /**
     * 通过URL  生成文件file
     * @param url
     * @param suffix
     * @return
     */
    private static File createFileByUrl(String url, String suffix) {
        byte[] byteFile = getImageFromNetByUrl(url);
        if (byteFile != null) {
            File file = getFileFromBytes(byteFile, suffix);
            return file;
        } else {
            LOGGER.info("生成文件失败!");
            return null;
        }
    }
  /**
     * 创建临时文件
     * @param b   文件字节流
     * @param suffix  后缀
     * @return
     */
    private static File getFileFromBytes(byte[] b, String suffix) {
        BufferedOutputStream stream = null;
        File file = null;
        try {
            file = File.createTempFile("pattern", "." + suffix);
            LOGGER.info("临时文件位置:"+file.getCanonicalPath());
            FileOutputStream fstream = new FileOutputStream(file);
            stream = new BufferedOutputStream(fstream);
            stream.write(b);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (stream != null) {
                try {
                    stream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return file;
    }

2、url获取字节流—>获取临时文件

  /**
     * 通过URL  生成文件file
     * @param url
     * @param suffix
     * @return
     */
    private static File createFileByUrl(String url, String suffix) {
        byte[] byteFile = getImageFromNetByUrl(url);
        if (byteFile != null) {
            File file = getFileFromBytes(byteFile, suffix);
            return file;
        } else {
            LOGGER.info("生成文件失败!");
            return null;
        }
    }

   /**
     * 根据地址获得数据的字节流
     *
     * @param strUrl
     *            网络连接地址
     * @return
     */
    private static byte[] getImageFromNetByUrl(String strUrl) {
        try {
            URL url = new URL(strUrl);
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setRequestMethod("GET");
            conn.setConnectTimeout(5 * 1000);
            // 通过输入流获取图片数据
            InputStream inStream = conn.getInputStream();
            // 得到图片的二进制数据
            byte[] btImg = readInputStream(inStream);
            return btImg;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
  /**
     * 创建临时文件
     * @param b   文件字节流
     * @param suffix  后缀
     * @return
     */
    private static File getFileFromBytes(byte[] b, String suffix) {
        BufferedOutputStream stream = null;
        File file = null;
        try {
            file = File.createTempFile("pattern", "." + suffix);
            LOGGER.info("临时文件位置:"+file.getCanonicalPath());
            FileOutputStream fstream = new FileOutputStream(file);
            stream = new BufferedOutputStream(fstream);
            stream.write(b);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (stream != null) {
                try {
                    stream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return file;
    }

发布了47 篇原创文章 · 获赞 30 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_42083036/article/details/105687214