在做JAVA EE开发 有许多的上传图片,百度一大推...可真正懂的原理的却很少 故自己以反编译工具查看写出这样的一篇攻略----并非一段完整的流程:
核心类
common-fileload.jar
1.DiskFileItemFactory
2.ServeltFileUpload (该类有一个静态的判断在前台的form表单中是否以二进制上传的方法 具体方法为)
ServeltFileUpload .isMultipartContent() 该方法返回一个boolean类型的值 当为true时,方可继续向下进行
3.FileItem(上传的基本参数就封装在该类下)
eg:代码片段
//在源码中可以看出DiskFileFactory虽有Factory但却是一个java类 所以直接new出即可
DiskFileItemFactory dfif = new DiskFileFactory();
//构造器中将DiskFileItemFactory实例传入得到servletFileUpload的实例
ServletFileUpload sFileUpload = new ServletFileUpload(dfif );
//运用sFileUpload的parseRequest(HttpServletRequest ) 将request转化成list对象
/*
这边说明一下因为要将list中的对象转化成FileItem对象,思路不只一个的 这边的做法是将
list的iterator()方法得到Iterator的迭代器 运用该迭代器的next()方法形成Object对象强转成
FileItem对象 当然运用ArrayList循环也可以
感觉最简单的办法的就是先声明一个ArrayList<FileItem> fList = null
fList = (ArrayList)sFileUpload .parseRequest(request);
for( FileItem f : fList ){
f.XXXX什么什么的
}
*/
List list = sFileUpload .parseRequest(request);
Iterator it = list.iterator();
while(it.hasNext()){
FileItem fItem = (FileItem)it.next();//fItem核心的实例包含了你上传文件的所有的信息
if(fTtem.isFormField()){
}else{
String uploadFile = fItem.getName();//上传的文件名称例如Xxxx.png
String uploadFileffix = uploadFile .substring(uploadFile .indexof("."));//获得该文件的后缀 .png
String upLoadFileServerName = UUID. randomUUID().toString();//运用UUID的randomUUID()方法生成名称
String uploadFile = fItem.getContentType();//获得上传的文件的类型例如图片啊什么的
if(uploadFile .equals("image/png")){//这边是类型等于什么什么的格式
/*万事具备即可正式上传文件啦~~~*/
InputStream in = fItem.getStream();//得到该文件的输入流
FileOutputStream out = new FileOutputStream(getServletContext().getRealPath("/")+"upload" + upLoadFileServerName + uploadFileffix );
/*
这边说明一下
因为是文件所以用文件输出流
getServletContext().getRealPath("/")这是绝对路径tomcat服务器下的路径
upload 是tomcat webapps 项目下的自己新建的文件夹用来摆放上传后的文件
upLoadFileServerName + uploadFileffix 生成的文件名
*/
int len = 0;
byte [] bytes = new byte[1024];//字节数组存放信息
while((len = in.read(bytes)) > 0){
out.write(bytes , 0 , len);
}
out.close();
in.close();
}
}
}
ps : 欢迎加我微信,一起探讨技术, 注明csdn上看见的