两种java文件上传实例讲解
本文通过两种文件上传实例进行比较,帮助大家更好的学习java文件上传功能,具体内容如下
1.Java附件上传代码
@Controller
publicclassUploadFileextendsBaseJsonController{
/**
*附件上传
*
*@paramrequest
*@paramcreativeFile
*@paramresponse
*@return
*/
@RequestMapping(value="/upload/uploadFile.json")
publicvoiduploadFile(HttpServletRequestrequest,HttpServletResponseresponse){
/**
*1、为保证服务器安全,上传文件应该放在外界无法直接访问的目录下,比如放于WEB-INF目录下。
*2、为防止文件覆盖的现象发生,要为上传文件产生一个唯一的文件名。
*3、为防止一个目录下面出现太多文件,要使用hash算法打散存储。
*4、要限制上传文件的最大值。
*5、要限制上传文件的类型,在收到上传文件名时,判断后缀名是否合法。
*/
//得到上传文件的保存目录,将上传的文件存放于WEB-INF目录下,不允许外界直接访问,保证上传文件的安全
StringsavePath=request.getSession().getServletContext().getRealPath("/WEB-INF/upload");
//上传时生成的临时文件保存目录
StringtempPath=request.getSession().getServletContext().getRealPath("/WEB-INF/temp");
FiletmpFile=newFile(tempPath);
if(!tmpFile.exists()){
//创建临时目录
tmpFile.mkdirs();
}
//消息提示
JSONArrayarr=newJSONArray();
Map<String,Object>map=null;
InputStreamin=null;
FileOutputStreamout=null;
try{
//使用Apache文件上传组件处理文件上传步骤:
//1、创建一个DiskFileItemFactory工厂
DiskFileItemFactoryfactory=newDiskFileItemFactory();
//设置工厂的缓冲区的大小,当上传的文件大小超过缓冲区的大小时,就会生成一个临时文件存放到指定的临时目录当中。
factory.setSizeThreshold(1024*100);//设置缓冲区的大小为100KB,如果不指定,那么缓冲区的大小默认是10KB
//设置上传时生成的临时文件的保存目录
factory.setRepository(tmpFile);
//2、创建一个文件上传解析器
ServletFileUploadupload=newServletFileUpload(factory);
//监听文件上传进度
upload.setProgressListener(newProgressListener(){
publicvoidupdate(longpBytesRead,longpContentLength,intarg2){
System.out.println("文件大小为:"+pContentLength+",当前已处理:"+pBytesRead);
}
});
//解决上传文件名的中文乱码
upload.setHeaderEncoding("UTF-8");
//3、判断提交上来的数据是否是上传表单的数据
if(!ServletFileUpload.isMultipartContent(request)){
//按照传统方式获取数据
return;
}
//设置上传单个文件的大小的最大值,目前是设置为1024*1024字节,也就是20MB
upload.setFileSizeMax(1024*1024*20);
//设置上传文件总量的最大值,最大值=同时上传的多个文件的大小的最大值的和,目前设置为40MB
upload.setSizeMax(1024*1024*40);
//4、使用ServletFileUpload解析器解析上传数据,解析结果返回的是一个List<FileItem>集合,每一个FileItem对应一个Form表单的输入项
@SuppressWarnings("unchecked")
List<FileItem>list=upload.parseRequest(request);
for(FileItemitem:list){
//如果fileitem中封装的是普通输入项的数据
if(item.isFormField()){
Stringname=item.getFieldName();
//解决普通输入项的数据的中文乱码问题
Stringvalue=item.getString("UTF-8");
//value=newString(value.getBytes("iso8859-1"),"UTF-8");
System.out.println(name+"="+value);
}else{//如果fileitem中封装的是上传文件
//得到上传的文件名称,
Stringfilename=item.getName();
if(filename==null||filename.trim().equals("")){
continue;
}
//注意:不同的浏览器提交的文件名是不一样的,有些浏览器提交上来的文件名是带有路径的,如:c:\a\b\1.txt,而有些只是单纯的文件名,如:1.txt
//处理获取到的上传文件的文件名的路径部分,只保留文件名部分
filename=filename.substring(filename.lastIndexOf("\\")+1);
//得到上传文件的扩展名
StringfileExtName=filename.substring(filename.lastIndexOf(".")+1);
//如果需要限制上传的文件类型,那么可以通过文件的扩展名来判断上传的文件类型是否合法
if(StringUtils.equals(fileExtName,"rar")||StringUtils.equals(fileExtName,"zip")){
thrownewBizException("","禁止上传压缩文件!");
}
/*************/
//获取item中的上传文件的输入流
in=item.getInputStream();
/************/
//得到文件保存的名称
StringsaveFilename=makeFileName(filename);
//得到文件的保存目录
StringrealSavePath=makePath(saveFilename,savePath);
//创建一个文件输出流
out=newFileOutputStream(realSavePath+"\\"+saveFilename);
//创建一个缓冲区
bytebuffer[]=newbyte[1024];
//判断输入流中的数据是否已经读完的标识
intlen=0;
//循环将输入流读入到缓冲区当中,(len=in.read(buffer))>0就表示in里面还有数据
while((len=in.read(buffer))>0){
//使用FileOutputStream输出流将缓冲区的数据写入到指定的目录(savePath+"\\"+filename)当中
out.write(buffer,0,len);
}
//关闭输入流
in.close();
//关闭输出流
out.close();
//删除处理文件上传时生成的临时文件
item.delete();
map=newHashMap<String,Object>();
map.put("saveFilename",saveFilename);
map.put("realSavePath",realSavePath);
arr.add(map);
}
}
returnSuccessJSON("上传成功",arr,response);
}catch(FileUploadBase.FileSizeLimitExceededExceptione){
e.printStackTrace();
returnFailJSON(e.getMessage(),"单个文件超出最大值!!!",response);
}catch(FileUploadBase.SizeLimitExceededExceptione){
e.printStackTrace();
returnFailJSON(e.getMessage(),"上传文件的总的大小超出限制的最大值!!!",response);arr.toString();
}catch(Exceptione){
e.printStackTrace();
returnFailJSON(e.getMessage(),"文件上传失败!",response);arr.toString();
}finally{
try{
//关闭输入流
in.close();
//关闭输出流
out.close();
}catch(IOExceptione){
}
}
}
/**
*@Method:makeFileName
*@Description:生成上传文件的文件名,文件名以:uuid+"_"+文件的原始名称
*@Anthor:xuwentao
*@paramfilename文件的原始名称
*@returnuuid+"_"+文件的原始名称
*/
privateStringmakeFileName(Stringfilename){//2.jpg
//为防止文件覆盖的现象发生,要为上传文件产生一个唯一的文件名
returnUUID.randomUUID().toString()+"_"+filename;
}
/**
*为防止一个目录下面出现太多文件,要使用hash算法打散存储
*@Method:makePath
*@Description:
*@Anthor:xuwentao
*
*@paramfilename文件名,要根据文件名生成存储目录
*@paramsavePath文件存储路径
*@return新的存储目录
*/
privateStringmakePath(Stringfilename,StringsavePath){
//得到文件名的hashCode的值,得到的就是filename这个字符串对象在内存中的地址
inthashcode=filename.hashCode();
intdir1=hashcode&0xf;//0--15
intdir2=(hashcode&0xf0)>>4;//0-15
//构造新的保存目录
Stringdir=savePath+"\\"+dir1+"\\"+dir2;//upload\2\3upload\3\5
//File既可以代表文件也可以代表目录
Filefile=newFile(dir);
//如果目录不存在
if(!file.exists()){
//创建目录
file.mkdirs();
}
returndir;
}
}
2.Java上传简历代码
/**
*上传简历
*1--创建文件失败2--异常3--上传失败4--文件未获取5--文件未删除6--请上传word、excel、ppt、pdf文件
*/
/*路径分隔符:用于自适应操作系统*/
privatestaticfinalStringFILE_SEPARATOR=System.getProperties()
.getProperty("file.separator");
/**
*上传文件
*
*@paramFileIO
*@paramoldContractURL
*@paramrequest
*@return返回文件地址(相对地址,非绝对地址)
*/
@Override
publicStringupload(MultipartFileFileIO,StringoldContractURL,HttpServletRequestrequest){
StringuploadUrl=request.getSession().getServletContext().getRealPath("files");
//删除文件及文件夹
if(oldContractURL!=null){
StringoldDirectory=oldContractURL.substring(5,
oldContractURL.lastIndexOf(FILE_SEPARATOR));
Filefile=newFile(uploadUrl+oldDirectory);
booleanflag=deleteDir(file);
if(!flag){
logger.error("旧文件删除失败");
return"5";
}
}
//上传新的简历文件
longnow=System.currentTimeMillis();
uploadUrl=uploadUrl+FILE_SEPARATOR+now+FILE_SEPARATOR;
StringresumeName="";
if(!FileIO.isEmpty()){
resumeName=StringUtils.deleteWhitespace(FileIO.getOriginalFilename());
//判断文件后缀
/*Stringsuffix=resumeName.substring(resumeName.lastIndexOf("."),resumeName.length())
.toLowerCase();
if(!".doc".equals(suffix)&&!".docx".equals(suffix)&&!".xls".equals(suffix)
&&!".xlsx".equals(suffix)&&!".ppt".equals(suffix)&&!".pptx".equals(suffix)
&&!".pdf".equals(suffix)){
logger.error("不是word、excel、ppt、pdf文件");
return"6";
}*/
}else{
logger.error("文件未获取");
return"4";
}
Filedir=newFile(uploadUrl);
if(!dir.exists()){
dir.mkdirs();
}
FiletargetFile=newFile(uploadUrl+resumeName);
if(!targetFile.exists()){
try{
targetFile.createNewFile();
}catch(IOExceptione){
logger.error("文件创建失败",e);
return"1";
}
}
try{
FileIO.transferTo(targetFile);
}catch(IllegalStateExceptione){
logger.error("语句异常",e);
return"2";
}catch(IOExceptione){
logger.error("上传失败",e);
return"3";
}
returnFILE_SEPARATOR+"files"+FILE_SEPARATOR+now+FILE_SEPARATOR+resumeName;
}
/**
*递归删除目录下的所有文件及子目录下所有文件
*@paramdir将要删除的文件目录
*@returnbooleanReturns"true"ifalldeletionsweresuccessful.
*Ifadeletionfails,themethodstopsattemptingto
*deleteandreturns"false".
*/
publicbooleandeleteDir(Filedir){
if(dir.isDirectory()){
String[]children=dir.list();
//递归删除目录中的子目录下
for(inti=0;i<children.length;i++){
booleansuccess=deleteDir(newFile(dir,children[i]));
if(!success){
returnfalse;
}
}
}
//目录此时为空,可以删除
returndir.delete();
}
以上就是本文的全部内容,希望对大家的学习有所帮助,掌握java文件上传的技巧。