java servlet图片上传_JAVA文件上传 ServletFileUpLoad 实例

1 packagecn.gs.ly;2

3 importjava.io.File;4 importjava.io.FileOutputStream;5 importjava.io.IOException;6 importjava.io.InputStream;7 importjava.io.OutputStream;8 importjava.util.List;9

10 importjavax.servlet.ServletException;11 importjavax.servlet.http.HttpServlet;12 importjavax.servlet.http.HttpServletRequest;13 importjavax.servlet.http.HttpServletResponse;14

15 importorg.apache.commons.fileupload.FileItem;16 importorg.apache.commons.fileupload.FileUploadException;17 importorg.apache.commons.fileupload.ProgressListener;18 importorg.apache.commons.fileupload.disk.DiskFileItemFactory;19 importorg.apache.commons.fileupload.servlet.ServletFileUpload;20

21

22 public class FileUploadServlet extendsHttpServlet {23 @Override24 protected void doPost(HttpServletRequest req, HttpServletResponse resp) throwsServletException, IOException {25 try{26 //得到上传文件的保存目录。 将上传的文件存放于WEB-INF目录下,不允许外界直接访问,保证上传文件的安全

27 String realPath = this.getServletContext().getRealPath("/upload");///WEB-INF/files

28 System.out.println("文件存放位置:"+realPath);29 //设置临时目录。 上传文件大于缓冲区则先放于临时目录中

30 String tempPath = "E:\\tempPath";31 System.out.println("临时文件存放位置:"+tempPath);32

33

34 //判断存放上传文件的目录是否存在(不存在则创建)

35 File f = newFile(realPath);36 if(!f.exists()&&!f.isDirectory()){37 System.out.println("目录或文件不存在! 创建目标目录。");38 f.mkdir();39 }40 //判断临时目录是否存在(不存在则创建)

41 File f1 = newFile(tempPath);42 if(!f1.isDirectory()){43 System.out.println("临时文件目录不存在! 创建临时文件目录");44 f1.mkdir();45 }46

47 /**

48 * 使用Apache文件上传组件处理文件上传步骤:49 *50 **/

51 //1、设置环境:创建一个DiskFileItemFactory工厂

52 DiskFileItemFactory factory = newDiskFileItemFactory();53

54 //设置上传文件的临时目录

55 factory.setRepository(f1);56

57 //2、核心操作类:创建一个文件上传解析器。

58 ServletFileUpload upload = newServletFileUpload(factory);59 //解决上传"文件名"的中文乱码

60 upload.setHeaderEncoding("UTF-8");61

62 //3、判断enctype:判断提交上来的数据是否是上传表单的数据

63 if(!ServletFileUpload.isMultipartContent(req)){64 System.out.println("不是上传文件,终止");65 //按照传统方式获取数据

66 return;67 }68

69 //==获取输入项==70 // //限制单个上传文件大小(5M)71 //upload.setFileSizeMax(1024*1024*4);72 // //限制总上传文件大小(10M)73 //upload.setSizeMax(1024*1024*6);74

75 //4、使用ServletFileUpload解析器解析上传数据,解析结果返回的是一个List集合,每一个FileItem对应一个Form表单的输入项

76 List items =upload.parseRequest(req);77 for(FileItem item:items){78 //如果fileitem中封装的是普通输入项的数据(输出名、值)

79 if(item.isFormField()){80 String filedName = item.getFieldName();//普通输入项数据的名81 //解决普通输入项的数据的中文乱码问题

82 String filedValue = item.getString("UTF-8");//普通输入项的值

83 System.out.println("普通字段:"+filedName+"=="+filedValue);84 }else{85 //如果fileitem中封装的是上传文件,得到上传的文件名称,

86 String fileName = item.getName();//上传文件的名87 //多个文件上传输入框有空 的 异常处理

88 if(fileName==null||"".equals(fileName.trim())){ //去空格是否为空

89 continue;//为空,跳过当次循环, 第一个没输入则跳过可以继续输入第二个

90 }91

92 //注意:不同的浏览器提交的文件名是不一样的,有些浏览器提交上来的文件名是带有路径的,如: c:\a\b\1.txt,而有些只是单纯的文件名,如:1.txt93 //处理上传文件的文件名的路径,截取字符串只保留文件名部分。//截取留最后一个"\"之后,+1截取向右移一位("\a.txt"-->"a.txt")

94 fileName = fileName.substring(fileName.lastIndexOf("\\")+1);95 //拼接上传路径。存放路径+上传的文件名

96 String filePath = realPath+"\\"+fileName;97 //构建输入输出流

98 InputStream in = item.getInputStream(); //获取item中的上传文件的输入流

99 OutputStream out = new FileOutputStream(filePath); //创建一个文件输出流100

101 //创建一个缓冲区

102 byte b[] = new byte[1024];103 //判断输入流中的数据是否已经读完的标识

104 int len = -1;105 //循环将输入流读入到缓冲区当中,(len=in.read(buffer))!=-1就表示in里面还有数据

106 while((len=in.read(b))!=-1){ //没数据了返回-1107 //使用FileOutputStream输出流将缓冲区的数据写入到指定的目录(savePath+"\\"+filename)当中

108 out.write(b, 0, len);109 }110 //关闭流

111 out.close();112 in.close();113 //删除临时文件

114 try{115 Thread.sleep(3000);116 } catch(InterruptedException e) {117 e.printStackTrace();118 }119 item.delete();//删除处理文件上传时生成的临时文件

120 System.out.println("文件上传成功");121 }122 }123 } catch(FileUploadException e) {124 //e.printStackTrace();

125 throw new RuntimeException("服务器繁忙,文件上传失败");126 }127 }128

129 @Override130 protected void doGet(HttpServletRequest req, HttpServletResponse resp) throwsServletException, IOException {131 this.doPost(req, resp);132 }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值