实现文件传输 第三方保存该文件到本地指定文件夹
大家好 今天给大家带来一遍关于如何将文件传输给第三方,第三方要将文件保存在指定文件夹下这样的一个功能。主要功能其实是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();
}
}