20文件上传与下载
- 文件上传
- 上传用户头像
- 某些东西的详细信息中的图片
- 文件上传的地方
-数据库:一般存储字段信息,不适合存储文件
-服务器:文件一般都上传到服务器(图片、视频等),正常将上传的文件放在项目的某个地方
- 文件上传准备:
-在表单上有上传按钮
头像:<input name="fileupload" type="file">
-所有的文件上传,method=post
-文件上传的表单,enctype=“multipart/form-data”
-点击提交,将文件的流以及表单的所有内容都放在流里提交,request.getParamter(),对文件上传表单提交是无效的
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub String username=request.getParameter("username"); String headerImg=request.getParameter("fileupload"); System.out.println("用户名:"+username); System.out.println("头像:"+headerImg); //引入commons-io包 ServletInputStream stream=request.getInputStream(); String string=IOUtils.toString(stream); System.out.println(string); response.sendRedirect(request.getContextPath()+"/index.jsp"); }
<form action="FileUploadServlet" method="post" enctype="multipart/form-data"> 用户名:<input name="username" type="text"> 头像:<input name="fileupload" type="file"> <input type="submit" value="上传"> </form>
- 文件上传
- 导包
- jsp
<body> <form action="FileUploadServlet" method="post" enctype="multipart/form-data"> 用户名:<input name="username" type="text"> 头像:<input name="fileupload" type="file"> <input type="submit" value="上传"> </form> </body>
- java
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // // TODO Auto-generated method stub // String username=request.getParameter("username"); // String headerImg=request.getParameter("fileupload"); // System.out.println("用户名:"+username); // System.out.println("头像:"+headerImg); //引入commons-io包 //获取整个请求的流 // ServletInputStream stream=request.getInputStream(); // String string=IOUtils.toString(stream); // System.out.println(string); //1.先创建一个工厂示例 DiskFileItemFactory factory=new DiskFileItemFactory(); //2.创建一个专门用来处理servlet文件上传的对象 ServletFileUpload fileUpload=new ServletFileUpload(factory); //3.解析文件上传请求 try { //返回的list,封装什么?FileItem //FileItem;就是封装了请求的流中的每个部件,每一个部件就对应一个FileItem List<FileItem> list=fileUpload.parseRequest(request); for(FileItem fileItem:list){ if(fileItem.isFormField()){ //如果为true,则为普通的key-value //getFieldName值就是获取的表单项的name值 String fieldName=fileItem.getFieldName(); //获取的是文件名(此处获取不到) String name=fileItem.getName(); System.out.println("普通表单项:"+fieldName); System.out.println("普通表单项:"+name); }else{ //false代表的是一个文件 //getFieldName值就是获取的表单项的name值 String fieldName=fileItem.getFieldName(); //获取文件名,w3c标准的浏览器,文件名 //ie获取文件的路径 String name=fileItem.getName(); //返回-1代表不包含,返回0。。。表示索引号 int of=name.lastIndexOf("\\"); String substring=name.substring(of+1); //如果是文件项,getInputStream获取文件项的文件流 InputStream stream=fileItem.getInputStream(); //IOUtils工具转换这里要注释掉,否则会出现上传的文件大小为0的情况 //String string=IOUtils.toString(stream); //System.out.println(string); //保存流,动态获取文件夹路径 ServletContext servletContext=getServletContext(); String realPath=servletContext.getRealPath("/uploads"); //uuid,这个是文件名的前缀 String prefix=UUID.randomUUID().toString().replace("-", ""); System.out.println(substring); System.out.println(realPath+"\\"+prefix+"_"+substring); FileOutputStream outputStream=new FileOutputStream(realPath+"\\"+prefix+"_"+substring); //将输入流的内容写在输出流里 IOUtils.copy(stream, outputStream); //关闭输出流 outputStream.close(); } } } catch (FileUploadException e) { // TODO Auto-generated catch block e.printStackTrace(); } response.sendRedirect(request.getContextPath()+"/index.jsp"); }
- 步骤
1)创建工厂
DiskFileItemFactory factory=new DiskFileItemFactory();
2)创建专门用来解析servlet文件上传的对象
ServletFileUpload fileUpload=new ServletFileUpload(factory);
3)解析请求,把表单的所有的邮件封装返回,List,每个部件就是一个FileItem
List<FileItem> list=fileUpload.parseRequest(request);
4)解析每一个FileItem
for(FileItem fileItem:list){ if(fileItem.isFormField()){ //如果为true,则为普通的key-value //getFieldName值就是获取的表单项的name值 String fieldName=fileItem.getFieldName(); //直接获取普通表单项的值,参数为值的编码 String string=fileItem.getString("utf-8"); }else{ //false代表的是一个文件 //getFieldName值就是获取的表单项的name值 String fieldName=fileItem.getFieldName(); //获取文件名,w3c标准的浏览器,文件名 //ie获取文件的路径 String name=fileItem.getName(); //返回-1代表不包含,返回0。。。表示索引号 int of=name.lastIndexOf("\\"); String substring=name.substring(of+1); //如果是文件项,getInputStream获取文件项的文件流 InputStream stream=fileItem.getInputStream(); //IOUtils工具转换这里要注释掉,否则会出现上传的文件大小为0的情况 //String string=IOUtils.toString(stream); //System.out.println(string); //保存流,动态获取文件夹路径 ServletContext servletContext=getServletContext(); String realPath=servletContext.getRealPath("/uploads"); //uuid,这个是文件名的前缀 String prefix=UUID.randomUUID().toString().replace("-", ""); System.out.println(substring); System.out.println(realPath+"\\"+prefix+"_"+substring); FileOutputStream outputStream=new FileOutputStream(realPath+"\\"+prefix+"_"+substring); //将输入流的内容写在输出流里 IOUtils.copy(stream, outputStream); //关闭输出流 outputStream.close(); } }
- 文件下载
- jsp
<body> <a href="DownloadServlet">下载</a> </body>
- java
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub //本质就是告诉浏览器我给你的资源别直接打开,给我下载 //把要下载的资源的流传给浏览器 //1.设置响应的文件类型,文件是什么类型就设置什么类型 //response.setContentType(""); //获取要下载的资源文件类型 String mimeType=getServletContext().getMimeType("/p3.png"); response.setContentType(mimeType); //2.设置资源的处理方式,设置处理响应头 //String encode=new URLEncoder().encode(); //第一个参数就是文件名的字节数组 String string=new String("p3.png".getBytes("gbk"),"iso8859-1"); response.setHeader("Content-Disposition", "attachment;filename="+string); //3.可选,设置文件大小response.setContentLength(len) //解决中文文件名问题 String realPath=getServletContext().getRealPath("/p3.png"); FileInputStream is=new FileInputStream(realPath); ServletOutputStream os=response.getOutputStream(); IOUtils.copy(is, os); is.close(); os.close(); }
服务器部署
- 在eclipse中将整个项目export导出
- 将导出的war文件放在tomcat服务器下的webapps目录下
- 在tomcat服务器的bin目录下打开startup.bat启动运行服务器
- 设置tomcat服务需要管理员权限
安装tomcat作为一个服务
- 管理员权限
cd tomcat bin目录
service.bat install Tomcat6.0
- 删除一个服务
sc delete Tomcat6.0
目export导出
- 将导出的war文件放在tomcat服务器下的webapps目录下
- 在tomcat服务器的bin目录下打开startup.bat启动运行服务器
- 设置tomcat服务需要管理员权限
安装tomcat作为一个服务
- 管理员权限
cd tomcat bin目录
service.bat install Tomcat6.0
- 删除一个服务
sc delete Tomcat6.0
项目部署到tomcat下时,访问资源出现了404,原因是项目没有成功部署进来,经排查发现,是tomcat的jdk版本与项目的jdk版本不相符合,将jdk更新为最新的1.8版本,既能够解决filter类导不进tomcat的问题,又能解决最新的mysql出错的问题(最新的mysql需要jdk1.8版本及以上)