这篇文章主要介绍了多重零件档与文件(文件)的一些事儿,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
前言
前段时间碰到了中转文件的需求,需要使用http客户端(http客户端)中转一下文件,过程为:
在实现这个需求的过程中就用得到了多重零件档与文件、文件、而且我对前一个也不是很熟悉。记录一下
什么是MultipartFile
多重零件档是跳下去类型,代表超文本标记语言格式中日期表单方式上传的文件,包含二进制数据文件名称。]来自百度知道【中文】
MultipartFile 与 File 的 互相转换
美元1. File转MultipartFile(1):使用org。spring框架。嘲笑。网络。模拟多零件文件需要导入弹簧试验。冲突
公共静态void main(string[]args)引发异常[
字符串文件路径= f: test。txt ;
文件=新建文件(文件路径):
文件输入流文件输入流=新建文件输入流文件:
//mocckmultipartfile(字符串名称,@空字符串原始名称,@空字符串内容类型,InputStream内容流)
//其中originalfilename,字符串内容类型旧名字,类型可为空
//内容类型.应用_ oct _ stream。tostring()需要使用http客户端(http客户端)的包
multipart file multipart file=new mock multipart file( copy file . getname()、file。getname()、ContentType).应用_ oct _ stream。tostring()、fileInputStream:
系统。出去。println(multipartfile。getname());//输出copytest.txt
}
(2):使用commonsmmultipartfile
公共静态void main(string[]args)引发异常[
字符串文件路径= f: test。txt ;
文件=新建文件(文件路径):
//需要导入公共文件上传-共用档案上传的包
fileitem file item=new disk fileitem( copy file。 txt ,文件。问题类型(文件。topath()、false、file.getName()、(int)file.length()、file。getparetfile());
字节[]缓冲区=新字节[4096];
内部n;
try(输入流输入流=新文件输入流文件):输出流OS=文件项。getutputstream())
while ( (n=inputStream.read(缓冲区0.4096))!===1)}
os.write(缓冲区,0,n);
}
//也可以用IOUtils.copy(inputStream,OS);
multipart file multipart file=new commonsmmultipart file(文件项);
系统。出去。println(multipartfile。getname());
} catch(io异常e)}
e。print stack trace();
}
}
2. MultipartFile转File(1):使用文件(文件)转多重零件档的逆过程
你在看这个代码的时候会觉得很熟悉,是的这个就是文件(文件)转多重零件档的逆转过程,这个方法会在根目录生成一个文件,需要删除该文件。
公共静态void main(string[]args)引发异常[
内部n;
//得到多重零件档文件
multipart file multipart file=get file();
文件f=空:
//输出文件的新名称就是指上传后的文件名称
系统。出去。println( getname: multipart file。getname());
//输出源文件名称就是指上传前的文件名称
系统。出去。println( oriname: multipart file。getriginalfilname());
//创建文件
f=新文件(多文件。getriginalfilname());
try(输入流in=多个零件文件。getinpertstream());输出流OS=新文件输出流(f)]& gt
//得到文件流。以文件流的方式输出到新文件
//可以使用字节[]ss=多文件。getbytes();代替而你呢
字节[]缓冲区=新字节[4096];
while ((n=in.read(缓冲区0.4096))!===1)}
os.write(缓冲区,0,n);
}
//读取文件第一行
bufferedreader bufferedreader=新缓冲区报头(f));
系统。出去。println(buffer e reader。readline());
//输出路径
bufferedreader。close();
} catch(io异常e)}
e。print stack trace();
}
//输出文件(文件)的网址(URL)
System.out.println(f.toURI().图尔()。toString());
//输出文件的绝对路径
系统。出去。println(f . getabsolutepath());
//操作完上的文件需要删除在根目录下生成的文件
File File=new File(f . touri());
if (file.delete()){
System.out.println(删除成功);
}否则{
System.out.println(删除失败);
}
}
/**
*
* @描述返回多文件文件
* @退货组织。spring框架。网络。多部分。多部分文件
* @日期2019/1/5 11:08
* @auther dell
*/
公共静态多文件getFile()引发IOException {
字符串文件路径= F: test。txt ;
文件文件=新文件(文件路径);
FileItem FileItem=新磁盘FileItem(复制文件。 txt ,文件。探测内容类型(文件。topath()),false,file.getName(),(int)file.length(),file。获取父文件());
字节[]缓冲区=新字节[4096];
int n;
try(InputStream InputStream=新文件InputStream(file);输出流OS=fileitem。获取输出流()){
while((n=inputstream。读(缓冲区,0,4096))!=-1){
os.write(buffer,0,n);
}
//也可以用IOUtils.copy(inputStream,OS);
multipart file multipart file=new CommonsMultipartFile(fileItem);
系统。出去。println(多部分文件。getname());
返回多文件;
}catch (IOException e){
e。printstacktrace();
}
返回空
}
(2):使用转移到(本质上还是使用了流只不过是封装了步骤)
会生成文件,最后不需要文件要删除
公共静态void main(String[] args)引发异常{
string path= F: demo ;
文件文件=新文件(路径,‘演示。txt’);
//得到多文件文件
multipart file multipart file=getFile();
/* byte[]ss=多部分文件。getbytes();
输出流OS=新文件输出流(file);
OS。写字(ss);
OS。close();*/
多部分文件。transferto(文件);
//读取文件第一行
缓冲读取器缓冲读取器=新缓冲读取器(新文件读取器(文件));
系统。出去。println(缓冲阅读器。readline());
//输出绝对路径
系统。出去。println(文件。getabsolutepath());
缓冲阅读器。close();
//操作完上的文件需要删除在根目录下生成的文件
if (file.delete()){
System.out.println(删除成功);
}否则{
System.out.println(删除失败);
}
}
/**
*
* @描述返回多文件文件
* @退货组织。spring框架。网络。多部分。多部分文件
* @日期2019/1/5 11:08
* @auther dell
*/
公共静态多文件getFile()引发IOException {
字符串文件路径= F: test。txt ;
文件文件=新文件(文件路径);
FileItem FileItem=新磁盘FileItem(复制文件。 txt ,文件。探测内容类型(文件。topath()),false,file.getName(),(int)file.length(),file。获取父文件());
字节[]缓冲区=新字节[4096];
int n;
try(InputStream InputStream=新文件InputStream(file);输出流OS=fileitem。获取输出流()){
while((n=inputstream。读(缓冲区,0,4096))!=-1){
os.write(buffer,0,n);
}
//也可以用IOUtils.copy(inputStream,OS);
multipart file multipart file=new CommonsMultipartFile(fileItem);
系统。出去。println(多部分文件。getname());
返回多文件;
}catch (IOException e){
e。printstacktrace();
}
返回空
}
(3):使用fileutils。复制inputstreamtofile()
也是会生成文件,到最后也是要删除文件
公共静态void main(String[] args)引发异常{
string path= F: demo ;
文件文件=新文件(路径,‘演示。txt’);
//得到多文件文件
multipart file multipart file=get file();
//把流输出到文件
fileutils。copinputstreamtofile(multipart file。getinpertstream()文件);
//读取文件第一行
bufferedReader=新缓冲头(新文件):
系统。出去。println(buffer e reader。readline());
//输出绝对路径
系统。出去。println(get bsolutesh()文件);
bufferedreader。close();
//操作完上的文件需要删除在根目录下生成的文件
if (file.delete()))
System.out.println(删除成功);
}否则
System.out.println(删除失败);
}
}
/**
*
* @描述返回多重零件档文件
* @退货组织。springframework网络。多部分。多文件
* @ 2019年一月一日/5月11日:08
* @验证者戴尔
*/
公共静态多部分文件getfile()引发io异常[
字符串文件路径= f: test。txt ;
文件=新建文件(文件路径):
fileitem file item=new disk fileitem( copy file。 txt ,文件。问题类型(文件。topath()、false、file.getName()、(int)file.length()、file。getparetfile());
字节[]缓冲区=新字节[4096];
内部n;
try(输入流输入流=新文件输入流文件):输出流OS=文件项。getutputstream())
while ( (n=inputStream.read(缓冲区0.4096))!===1)}
os.write(缓冲区,0,n);
}
//也可以用IOUtils.copy(inputStream,OS);
multipart file multipart file=new commonsmmultipart file(文件项);
系统。出去。println(multipartfile。getname());
返回多部分文件;
} catch(io异常e)}
e。printstacktrace();
}
返回空:
}
3:强转类型commonsmmultipart file=(commonsmmultipart file)multipart file;
diskfileitem diskfileitem=(diskfileitem)commonsmmultipartfile。getfile item();
file=diskfileitem。getstorlocation();
这种强转你获得的文件(文件)只是一个空壳
你能获取的也只有这个f: upload _ EDF 39 f _ 2894 _ 4b 66 _ b 865 _ D5 FB 8636 BDF 3 _ 00000000。终端监督程式(Terminal Monitor Program的缩写)网上有说会在根目录生成临时文件的,从tmp(tmp)也可以看出来是个临时文件,但是我试了好几次啥都没找到.我.
直接获取这个文件(文件)读取内容也是会报文件找不到的这是必然的当然也有在跳下去配置文件配置公共smmultipartresolver的这就感觉很麻烦了.我.
但是我们可以看一下diskFileItem看下图是不是很熟悉了,从diskFileItem可以获取文件流,其实你看了源码你就知道获取文件流都是从这里获取的。剩下的就好办了我就不赘述了/中。
在使用临时文件的时候可以使用缓冲区创建临时文件
美元//createTempFile(字符串前缀,字符串后缀)
//前缀(前缀)文件名字尾文件格式
//默认是tmp(tmp)格式c: users Dell appdata local temp tmp 87847230512789016。终端监督程式(Terminal Monitor Program的缩写)
file=File.createTempFile(tmp ,null);
//txt格式c: users Dell appdata local temp tmp 2888293586594052933。文本文件(textfile)
file=File.createTempFile(tmp ,).txt’);
HttpClient构建上传文件参数并实现中转文件
美元这里不自己给例子了,参考了其他博客的代码
//获取文件名称
字符串文件名=文件。getriginalfilname();
HttpPost httpPost=新HttpPost(url):
//创建文件上传实体
多利益攸关方构建器=多利益攸关方构建器。create();
builder.addBinaryBody(file ,file。getinpertstream())内容类型.multipart _ form _ data文件名:
建筑商。addtextody( filename ,文件名);
实体=构建者。构建():
httppost。setentity(实体);
http响应=http客户端。执行(http post)://执行提交
执行提交之后你会发现你上传的文件名会出现中文乱码
这里参考
http客户端(http客户端)上传文件中文名乱码该文章详细说明了为什么会乱码以及怎么解决
我使用的解决办法是:
//设置模式为RFC6532
建筑商。设置模式(http multipartmode).RFC6532:
以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。