Java web第十五天

实现文件上传:

在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包:
Java web第十五天

创建上传页面:

```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);
    }
}

 

上一篇:9-3.MVC 自定义过滤器(Filter)实现路由控制、异常处理、授权处理(获取客户端信息)


下一篇:ELK 之 GeoIP