实现文件传输,第三方保存该文件到本地指定文件夹

645 阅读4分钟

实现文件传输 第三方保存该文件到本地指定文件夹

大家好 今天给大家带来一遍关于如何将文件传输给第三方,第三方要将文件保存在指定文件夹下这样的一个功能。主要功能其实是MultipartFile不能直接传输第三方,我们需要转换另一种格式,不多说我们直接上代码

我方controller层 入参可以看例子 可根据自己需求适当更改

/**
 * 入参
 * @param pictureName 文件名字 如:CgxjAmGXhDqAMoJuAA_WEmhhhwk717.jpg
 * @param filePath 文件要存放的地址 如:group1/M00/00/63/
 * @param fullPath 全地址路径 如:group1/M00/00/63/CgxjAmGXhDqAMoJuAA_WEmhhhwk717.jpg
 * @param file 要传输的文件
 * @return
 */
@PostMapping("/getSendContent")
@ResponseBody
@Permitted
public ResponseResult getSendContent(@RequestParam("pictureName") String pictureName,@RequestParam("filePath") String filePath,
                                     @RequestParam("fullPath") String fullPath,@RequestParam("file") MultipartFile file) {

    SendContent sendContent = new SendContent();
    sendContent.setPictureName(pictureName);
    sendContent.setFilePath(filePath);
    sendContent.setFullPath(fullPath);
    sendContent.setFile(file);
    sendServcie.getSendContent(sendContent);
    return new ResponseResult();
}
```
```

我方service层主要是解决file流,MultipartFile不能直接传输第三方,这也是我方做的唯一数据处理

@Override
public void getSendContent(SendContent sendContent) {
    MultipartFile multipartFile = sendContent.getFile();
    FileSystemResource fileSystemResource = null;
    File file= null;
    try {
        //MultipartFile 格式转换成FileSystemResource
        Map map = PictureUtils.FifleSystemResource(multipartFile);
        Object fileResource = map.get("fileResource");
        fileSystemResource = (FileSystemResource) fileResource;
        //调取第三方接口 这里可以写httpClient之类的都可以 有需要的可以私聊这里不做说明 网上也有很多
        reqInterfaceConfigService.syncYjjRequest("type",contentDto,fileSystemResource);
    }catch (Exception e) {
        e.printStackTrace();
    }finally {
        if (null!= file) {
            file.delete();
        }
    }
}

我方转换工具类,工具类中只用一种方法,其他的可以删除,也可以备用其他需求

package com.jz.app.server.docking.util;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.io.FileUtils;
import org.apache.http.entity.ContentType;
import org.springframework.core.io.FileSystemResource;
import org.springframework.http.HttpEntity;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import org.springframework.web.multipart.commons.CommonsMultipartFile;

import javax.servlet.http.HttpServletRequest;
import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.HashMap;
import java.util.List;
import java.util.Map;


//java将图片的url转换成File,File转换成二进制流byte

/**
 * Created by cb on 2022/12/20 15:41
 */
public class PictureUtils {
    //将Url转换为File
    public static File UrltoFile(String url) throws Exception {
        HttpURLConnection httpUrl = (HttpURLConnection) new URL(url).openConnection();
        httpUrl.connect();
        InputStream ins=httpUrl.getInputStream();
        File file = new File(System.getProperty("java.io.tmpdir") + File.separator + "xia");//System.getProperty("java.io.tmpdir")缓存
        if (file.exists()) {
            file.delete();//如果缓存中存在该文件就删除
        }
        OutputStream os = new FileOutputStream(file);
        int bytesRead;
        int len = 8192;
        byte[] buffer = new byte[len];
        while ((bytesRead = ins.read(buffer, 0, len)) != -1) {
            os.write(buffer, 0, bytesRead);
        }
        os.close();
        ins.close();
        return file;

    }
    //将File对象转换为byte[]的形式
    public static byte[] FileTobyte(File file){
        FileInputStream fileInputStream = null;
        byte[] imgData = null;

        try {

            imgData = new byte[(int) file.length()];

            //read file into bytes[]
            fileInputStream = new FileInputStream(file);
            fileInputStream.read(imgData);

        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (fileInputStream != null) {
                try {
                    fileInputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

        }
        return imgData;
    }

    public static File getFile(String url,String fileName) throws Exception {
        File file = null;

        URL urlfile;
        InputStream inStream = null;
        OutputStream os = null;
        try {
            //注:这里的后缀可以根据你传入的url的图片类型后缀定义,
            //这里因为项目业务需求,回调是pdf,所以写死了
            file = File.createTempFile("temp_image", fileName);
            //下载
            urlfile = new URL(url);
            inStream = urlfile.openStream();
            os = new FileOutputStream(file);

            int bytesRead = 0;
            byte[] buffer = new byte[8192];
            while ((bytesRead = inStream.read(buffer, 0, 8192)) != -1) {
                os.write(buffer, 0, bytesRead);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (null != os) {
                    os.close();
                }
                if (null != inStream) {
                    inStream.close();
                }

            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return file;
    }

    public static InputStream downloadWxImage(String url) {
        InputStream inputStream = null;
        try {
            HttpURLConnection conn = (HttpURLConnection) new URL(url).openConnection();
            conn.connect();
            inputStream= conn.getInputStream();

        } catch (IOException e) {
            e.printStackTrace();
        }
        return inputStream;
    }

    /**
     * url转变为 MultipartFile对象
     * @param url
     * @param fileName
     * @return
     * @throws Exception
     */
    public static MultipartFile createFileItem(String url, String fileName) throws Exception{
        FileItem item = null;
        try {
            HttpURLConnection conn = (HttpURLConnection) new URL(url).openConnection();
            conn.setReadTimeout(30000);
            conn.setConnectTimeout(30000);
            //设置应用程序要从网络连接读取数据
            conn.setDoInput(true);
            conn.setRequestMethod("GET");
            if (conn.getResponseCode() == HttpURLConnection.HTTP_OK) {
                InputStream is = conn.getInputStream();
                FileItemFactory factory = new DiskFileItemFactory(16, null);
                String textFieldName = "uploadfile";
                item = factory.createItem(textFieldName, ContentType.APPLICATION_OCTET_STREAM.toString(), false, fileName);
                OutputStream os = item.getOutputStream();
                int bytesRead = 0;
                byte[] buffer = new byte[8192];
                while ((bytesRead = is.read(buffer, 0, 8192)) != -1) {
                    os.write(buffer, 0, bytesRead);
                }
                os.close();
                is.close();
            }
        } catch (IOException e) {
            throw new RuntimeException("文件下载失败", e);
        }
        return new CommonsMultipartFile(item);
    }
    /**
     * MultipartFile 转换为 File 文件
     *
     * @param multipartFile
     * @return
     */
    public final static File transferToFile(MultipartFile multipartFile) {
        //选择用缓冲区来实现这个转换即使用java 创建的临时文件 使用 MultipartFile.transferto()方法 。
        File file = null;
        try {
            String originalFilename = multipartFile.getOriginalFilename();
            //获取文件后缀
            String prefix = originalFilename.substring(originalFilename.lastIndexOf("."));
            //String[] filename = originalFilename.split("\.");
            // file = File.createTempFile(filename[0], filename[1]);    //注意下面的 特别注意!!!
            file = File.createTempFile(originalFilename, prefix);    //创建零食文件
            multipartFile.transferTo(file);
            //删除
            file.deleteOnExit();
        } catch (IOException e) {
            e.printStackTrace();
        }

        return file;
    }

    public static final Map FifleSystemResource(MultipartFile file) {
        Map map = new HashMap();

        MultiValueMap<String, FileSystemResource> params = new LinkedMultiValueMap<>();
        try {
            FileUtils.writeByteArrayToFile(new File(file.getOriginalFilename()), file.getBytes());
            FileSystemResource fileResource = new FileSystemResource(new File(file.getOriginalFilename()));
            map.put("fileResource",fileResource);
            File file1 = fileResource.getFile();
            map.put("file1",file1);
            return map;
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

    public static final  void dd(HttpEntity request){
        List<MultipartFile> fileList =null;
        // 判断http请求中是否存在文件l
        if(ServletFileUpload.isMultipartContent((HttpServletRequest) request)){
            //解析成multipartFile
            MultipartHttpServletRequest multiRequest = (MultipartHttpServletRequest) request;
            //请求里key为File的元素(即文件元素)
            fileList = multiRequest.getFiles("file");
        }
        System.out.println(fileList);
    }
}

第三方controller接口,其实跟上面我方controller接口是一样的,但你如果不转换FileSystemResource这个格式,第三方就接收不到

@PostMapping("/upload")
@Permitted
public ResponseResult upload(@RequestParam("pictureName") String pictureName,@RequestParam("filePath") String filePath,
                             @RequestParam("fullPath") String fullPath,@RequestParam("file") MultipartFile file) throws IOException {
    SendContent sendContent = new SendContent();
    sendContent.setFile(file);
    sendContent.setFilePath(filePath);
    sendContent.setFullPath(fullPath);
    sendContent.setPictureName(pictureName);
    storeFilesService.upload(sendContent);
    return new ResponseResult();
}

第三方service层主要是处理文件保存对应路径下,注意要指定是哪个盘下我的是D盘

@Transactional(rollbackFor = Exception.class)
public void upload(SendContent sendContent) throws IOException {
    //获取文件流
    MultipartFile multipartFile = sendContent.getFile();
    //获取文件名称
    String filename = sendContent.getPictureName();
    //获取文件保存的地址
    String uri = sendContent.getFilePath();
    //转换文件格式
    uri = uri.replaceAll("\\", "\\\\");
    //创建文件夹 并生成对应的文件在该文件夹下
    File file1 = new File("D:\"+uri);
    File file2 = new File("D:\"+uri+ "/" + filename);
    try{
        boolean newjavaFile = file1.mkdirs();
        System.out.println(newjavaFile);
        //保存图片到本地
        multipartFile.transferTo(file2);
        String absolutePath = file2.getAbsolutePath();
        System.out.println(absolutePath);
    }catch (IOException e){
        e.printStackTrace();
    }
}

好了 这个功能就实现了 当然也可以保存到数据库中 可以根据file流 通过fast等 生成url保存到数据库,如有问题可留言或者直接私信,祝大家前程似锦,身体健康