实现文件上传:
在Web页面中添加上传输入项是
在Servlet中读取上传文件的数据,并保存到本地硬盘中。
文件上传的相关API:
1. Fileltem 接口:
1String getName()方法
String getFieldName()方法
 void write(File file)方法
 String getString()方法
 public String getString()
 public String getString(java.lang.String encoding)
String getContentType()方法
 boolean isInMemory()方法
void delete()方法
InputStream getlnputStream()方法
long getSize()方法
创建项目,导入JAR包:
创建上传页面:
 ```cpp
 <%@ page language="java" contentType="text/html; charset=UTF-8"
     pageEncoding="UTF-8"%>
 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
                             "http://www.w3.org/TR/html4/loose.dtd">
 <html>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>文件上传</title>
 </head>
 <body>
      <form action="UploadServlet" method="post" 
       enctype="multipart/form-data">
          <table width="600px">
              <tr>
                  <td>上传者</td>
                  <td><input type="text" name="name" /></td>
              </tr>
              <tr>
                  <td>上传文件</td>
                  <td><input type="file" name="myfile" /></td>
              </tr>
              <tr>
                  <td colspan="2"><input type="submit" value="上传" /></td>
              </tr>
          </table>
      </form>
 </body>
 </html>
创建Servlet:
package cn.itcast.fileupload;
 import java.io.*;
 import java.util.*;
 import javax.servlet.*;
 import javax.servlet.annotation.WebServlet;
 import javax.servlet.http.*;
 import org.apache.commons.fileupload.*;
 import org.apache.commons.fileupload.disk.DiskFileItemFactory;
 import org.apache.commons.fileupload.servlet.ServletFileUpload;
 @WebServlet("/UploadServlet")
 //上传文件的Servlet类
 public class UploadServlet extends HttpServlet {
     private static final long serialVersionUID = 1L;
     public void doGet(HttpServletRequest request, HttpServletResponse response)
             throws ServletException, IOException {
         try {
             //设置ContentType字段值
             response.setContentType("text/html;charset=utf-8");
             // 创建DiskFileItemFactory工厂对象
             DiskFileItemFactory factory = new DiskFileItemFactory();
             //设置文件缓存目录,如果该目录不存在则新创建一个
             File f = new File("d:\\TempFolder");
             if (!f.exists()) {
                 f.mkdirs();
             }
             // 设置文件的缓存路径
             factory.setRepository(f);
             // 创建 ServletFileUpload对象
             ServletFileUpload fileupload = new ServletFileUpload(factory);
             //设置字符编码
             fileupload.setHeaderEncoding("utf-8");
             // 解析 request,得到上传文件的FileItem对象
             List<FileItem> fileitems = fileupload.parseRequest(request);
             //获取字符流
             PrintWriter writer = response.getWriter();
             // 遍历集合
             for (FileItem fileitem : fileitems) {
                 // 判断是否为普通字段
                 if (fileitem.isFormField()) {
                     // 获得字段名和字段值
                     String name = fileitem.getFieldName();
                     if(name.equals("name")){
                         //如果文件不为空,将其保存在value中
                         if(!fileitem.getString().equals("")){
                             String value = fileitem.getString("utf-8");
                             writer.print("上传者:" + value + "<br>");                            
                         }
                     }
                 } else {
                     // 获取上传的文件名
                     String filename = fileitem.getName();
                     //处理上传文件
                     if(filename != null && !filename.equals("")){
                         writer.print("上传的文件名称是:" + filename + "<br>");                        
                         // 截取出文件名
                         filename = filename.substring(filename.lastIndexOf("\\") + 1);                        
                         // 文件名需要唯一
                         filename = UUID.randomUUID().toString() + "_" + filename;
                         // 在服务器创建同名文件
                         String webPath = "/upload/";
                         //将服务器中文件夹路径与文件名组合成完整的服务器端路径
                         String filepath = getServletContext().getRealPath(webPath + filename);
                         // 创建文件
                         File file = new File(filepath);
                         file.getParentFile().mkdirs();
                         file.createNewFile();
                         // 获得上传文件流
                         InputStream in = fileitem.getInputStream();
                         // 使用FileOutputStream打开服务器端的上传文件
                         FileOutputStream out = new FileOutputStream(file);
                         // 流的对拷
                         byte[] buffer = new byte[1024];//每次读取1个字节
                         int len;
                         //开始读取上传文件的字节,并将其输出到服务端的上传文件输出流中
                         while ((len = in.read(buffer)) > 0)
                             out.write(buffer, 0, len);
                         // 关闭流
                         in.close();
                         out.close();
                         // 删除临时文件
                         fileitem.delete();
                         writer.print("上传文件成功!<br>");
                     }                                        
                 }
             }
         } catch (Exception e) {
             throw new RuntimeException(e);
         }
     }
     public void doPost(HttpServletRequest request, HttpServletResponse response)
             throws ServletException, IOException {
         doGet(request, response);
     }
 }
文件下载:
创建下载页面:
<%@ page language="java" contentType="text/html; charset=UTF-8"
     pageEncoding="UTF-8"%>
 <%@page import="java.net.URLEncoder"%>
 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
                             "http://www.w3.org/TR/html4/loose.dtd">
 <html>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>文件下载</title>
 </head>
 <body>
         <!-- <a href="/chapter12/DownloadServlet?filename=<%=URLEncoder.encode("猫.jpg", "utf-8")%>">文件下载 </a>-->
      
       <a href="/chapter12/DownloadServlet?filename=猫.jpg">文件</a> 
       
      <!--  <a href="download/猫.jpg">文件下载</a> -->
 </body>
 </html>
 创建Servlet:
  
package cn.itcast.fileupload;
 import java.io.*;
import java.net.URLEncoder;
 import javax.servlet.*;
 import javax.servlet.annotation.WebServlet;
 import javax.servlet.http.*;
 @WebServlet("/DownloadServlet")
 public class DownloadServlet extends HttpServlet {
     private static final long serialVersionUID = 1L;
     
     public void doGet(HttpServletRequest request, HttpServletResponse 
         response) throws ServletException, IOException {
         //设置ContentType字段值
         response.setContentType("text/html;charset=utf-8");
         //设置相应消息编码
         response.setCharacterEncoding("utf-8");
         //设置请求消息编码
         request.setCharacterEncoding("utf-8");                 
         //获取所要下载的文件名称
         String filename = request.getParameter("filename");        
         //对文件名称编码
         filename = new String(filename.trim().getBytes("iso8859-1"),"UTF-8");  
         //下载文件所在目录
         String folder = "/download/";
         // 通知浏览器以下载的方式打开
         response.addHeader("Content-Type", "application/octet-stream");
         response.addHeader("Content-Disposition", 
                 "attachment;filename="+URLEncoder.encode(filename,"utf-8"));
         // 通过文件流读取文件
         InputStream in = getServletContext().getResourceAsStream(
                 folder+filename);
         // 获取response对象的输出流
         OutputStream out = response.getOutputStream();
         byte[] buffer = new byte[1024];
         int len;
         //循环取出流中的数据
         while ((len = in.read(buffer)) != -1) {
             out.write(buffer, 0, len);
         }
    }
       public void doPost(HttpServletRequest request, HttpServletResponse 
           response) throws ServletException, IOException {
         doGet(request, response);
     }
 }
  










