什么是MultipartFile?
MultipartFile是spring类型,代表HTML中form data方式上传的文件,包含二进制数据+文件名称。
什么是File?
-
File类主要是JAVA为文件这块的操作(如删除、新增等)而设计的相关类
-
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;
}