聊聊MultipartFile与File的⼀些事⼉
前⾔
前段时间碰到了中转⽂件的需求,需要使⽤HttpClient中转⼀下⽂件,过程为:
在实现这个需求的过程中就⽤得到了MultipartFile与File,⽽且我对前⼀个也不是很熟悉。记录⼀下
什么是MultipartFile
MultipartFile是spring类型,代表HTML中form data⽅式上传的⽂件,包含⼆进制数据+⽂件名称。【来⾃百度知道】
MultipartFile 与 File 的互相转换
1. File转MultipartFile
(1):使⽤k.web.MockMultipartFile 需要导⼊spring-test.jar
public static void main(String[] args) throws Exception {
String filePath = "F:\\";
File file = new File(filePath);
FileInputStream fileInputStream = new FileInputStream(file);
// MockMultipartFile(String name, @Nullable String originalFilename, @Nullable String contentType, InputStream contentStream)
// 其中originalFilename,String contentType 旧名字,类型可为空
// ContentType.APPLICATION_String() 需要使⽤HttpClient的包
MultipartFile multipartFile = new MockMultipartFile("copy"+Name(),Name(),ContentType.APPLICATION_String(),fileInputStream); 
      System.out.Name()); // 输出
}
(2):使⽤CommonsMultipartFile
public static void main(String[] args) throws Exception {
String filePath = "F:\\";
File file = new File(filePath);
// 需要导⼊commons-fileupload的包
FileItem fileItem = new DiskFileItem("", Files.Path()),Name(),(int)file.length(),ParentFile());
byte[] buffer = new byte[4096];
int n;
try (InputStream inputStream = new FileInputStream(file); OutputStream os = OutputStream()){
while ( (n = ad(buffer,0,4096)) != -1){
os.write(buffer,0,n);
}
//也可以⽤py(inputStream,os);
MultipartFile multipartFile = new CommonsMultipartFile(fileItem);
System.out.Name());
}catch (IOException e){
e.printStackTrace();
}
}
2. MultipartFile转File
(1):使⽤File转MultipartFile的逆过程
你在看这个代码的时候会觉得很熟悉,是的这个就是File转MultipartFile的逆转过程,这个⽅法会在根⽬录⽣成⼀个⽂件,需要删除该⽂件。 public static void main(String[] args) throws Exception {
int n;
// 得到MultipartFile⽂件
MultipartFile multipartFile = getFile();
File f = null;
// 输出⽂件的新name 就是指上传后的⽂件名称
System.out.println("getName:"+Name());
// 输出源⽂件名称就是指上传前的⽂件名称
System.out.println("Oriname:"+OriginalFilename());
// 创建⽂件
f = new OriginalFilename());
try ( InputStream in  = InputStream(); OutputStream os = new FileOutputStream(f)){
// 得到⽂件流。以⽂件流的⽅式输出到新⽂件
// 可以使⽤byte[] ss = Bytes();代替while
byte[] buffer = new byte[4096];
while ((n = in.read(buffer,0,4096)) != -1){
os.write(buffer,0,n);
}
// 读取⽂件第⼀⾏
BufferedReader bufferedReader = new BufferedReader(new FileReader(f));
System.out.adLine());
// 输出路径
bufferedReader.close();
}catch (IOException e){
e.printStackTrace();
}
// 输出file的URL
System.out.URI().toURL().toString());
// 输出⽂件的绝对路径
System.out.AbsolutePath());
// 操作完上的⽂件需要删除在根⽬录下⽣成的⽂件
File file = new URI());
if (file.delete()){
System.out.println("删除成功");
}else {
System.out.println("删除失败");
}
}
/**
*
* @Description 返回MultipartFile⽂件
* @return org.springframework.web.multipart.MultipartFile
* @date 2019/1/5 11:08
* @auther dell
*/
public static MultipartFile getFile() throws IOException {
String filePath = "F:\\";
File file = new File(filePath);
spring怎么读取配置FileItem fileItem = new DiskFileItem("", Files.Path()),Name(),(int)file.length(),ParentFile());        byte[] buffer = new byte[4096];
int n;
try (InputStream inputStream = new FileInputStream(file); OutputStream os = OutputStream()){
while ( (n = ad(buffer,0,4096)) != -1){
os.write(buffer,0,n);
}
//也可以⽤py(inputStream,os);
MultipartFile multipartFile = new CommonsMultipartFile(fileItem);
System.out.Name());
return multipartFile;
}catch (IOException e){
e.printStackTrace();
}
return null;
}
(2):使⽤transferTo (本质上还是使⽤了流只不过是封装了步骤)
会⽣成⽂件,最后不需要⽂件要删除
public static void main(String[] args) throws Exception {
String path = "F:\\demo\\";
File file = new File(path,"");
// 得到MultipartFile⽂件
MultipartFile multipartFile = getFile();
/*byte[] ss = Bytes();
OutputStream os = new FileOutputStream(file);
os.write(ss);
os.close();*/
// 读取⽂件第⼀⾏
BufferedReader bufferedReader = new BufferedReader(new FileReader(file));
System.out.adLine());
// 输出绝对路径
System.out.AbsolutePath());
bufferedReader.close();
// 操作完上的⽂件需要删除在根⽬录下⽣成的⽂件
if (file.delete()){
System.out.println("删除成功");
}else {
System.out.println("删除失败");
}
}
/**
*
* @Description 返回MultipartFile⽂件
* @return org.springframework.web.multipart.MultipartFile
* @date 2019/1/5 11:08
* @auther dell
*/
public static MultipartFile getFile() throws IOException {
String filePath = "F:\\";
File file = new File(filePath);
FileItem fileItem = new DiskFileItem("", Files.Path()),Name(),(int)file.length(),ParentFile());        byte[] buffer = new byte[4096];
int n;
try (InputStream inputStream = new FileInputStream(file); OutputStream os = OutputStream()){
while ( (n = ad(buffer,0,4096)) != -1){
os.write(buffer,0,n);
}
/
/也可以⽤py(inputStream,os);
MultipartFile multipartFile = new CommonsMultipartFile(fileItem);
System.out.Name());
return multipartFile;
}catch (IOException e){
e.printStackTrace();
}
return null;
}
(3):使⽤pyInputStreamToFile()
也是会⽣成⽂件,到最后也是要删除⽂件
public static void main(String[] args) throws Exception {
String path = "F:\\demo\\";
File file = new File(path,"");
// 得到MultipartFile⽂件
MultipartFile multipartFile = getFile();
// 把流输出到⽂件
// 读取⽂件第⼀⾏
BufferedReader bufferedReader = new BufferedReader(new FileReader(file));
System.out.adLine());
// 输出绝对路径
System.out.AbsolutePath());
bufferedReader.close();
// 操作完上的⽂件需要删除在根⽬录下⽣成的⽂件
if (file.delete()){
System.out.println("删除成功");
}else {
System.out.println("删除失败");
}
}
/**
*
* @Description 返回MultipartFile⽂件
* @return org.springframework.web.multipart.MultipartFile
* @date 2019/1/5 11:08
* @auther dell
*/
public static MultipartFile getFile() throws IOException {
String filePath = "F:\\";
File file = new File(filePath);
FileItem fileItem = new DiskFileItem("", Files.Path()),Name(),(int)file.length(),ParentFile());
byte[] buffer = new byte[4096];
int n;
try (InputStream inputStream = new FileInputStream(file); OutputStream os = OutputStream()){
while ( (n = ad(buffer,0,4096)) != -1){
os.write(buffer,0,n);
}
//也可以⽤py(inputStream,os);
MultipartFile multipartFile = new CommonsMultipartFile(fileItem);
System.out.Name());
return multipartFile;
}catch (IOException e){
e.printStackTrace();
}
return null;
}
3:强转类型
CommonsMultipartFile commonsmultipartfile = (CommonsMultipartFile) multipartFile;
DiskFileItem diskFileItem = (DiskFileItem) FileItem();
File file = StoreLocation();
这种强转你获得的file只是⼀个空壳
你能获取的也只有这个F:\upload_edfce39f_2894_4b66_b865_p ⽹上有说会在根⽬录⽣成临时⽂件的,从tmp也可以看出来是个临时⽂件,但是我试了好⼏次啥都没到。。。。
直接获取这个file读取内容也是会报⽂件不到的这是必然的当然也有在spring配置⽂件配置CommonsMultipartResolver的这就感觉很⿇烦了。。。。
但是我们可以看⼀下diskFileItem 看下图是不是很熟悉了,从diskFileItem可以获取⽂件流,其实你看了源码你就知道获取⽂件流都是从这⾥获取的。剩下的就好办了我就不赘述了/。
在使⽤临时⽂件的时候可以使⽤缓冲区创建临时⽂件
//  createTempFile(String prefix, String suffix)
//  prefix ⽂件名 suffix ⽂件格式
// 默认是tmp格式  C:\Users\dell\AppData\Local\p
File file =ateTempFile("tmp", null);
// txt格式  C:\Users\dell\AppData\Local\
File file =ateTempFile("tmp", ".txt");
HttpClient构建上传⽂件参数并实现中转⽂件
这⾥不⾃⼰给例⼦了,参考了其他博客的代码
// 获取⽂件名称
String fileName = OriginalFilename();
HttpPost httpPost = new HttpPost(url);
// 创建⽂件上传实体
MultipartEntityBuilder builder = ate();
builder.addBinaryBody("file", InputStream(), ContentType.MULTIPART_FORM_DATA, fileName); builder.addTextBody("filename", fileName);
HttpEntity entity = builder.build();
httpPost.setEntity(entity);
HttpResponse response = ute(httpPost);// 执⾏提交
执⾏提交之后你会发现你上传的⽂件名会出现中⽂乱码
这⾥参考
该⽂章详细说明了为什么会乱码以及怎么解决
我使⽤的解决办法是:
//设置模式为RFC6532
builder.setMode(HttpMultipartMode.RFC6532);
以上为个⼈经验,希望能给⼤家⼀个参考,也希望⼤家多多⽀持。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。