javaweb----文件上传下载

一,上传文件

fileload.jsp

<%@ 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>Insert title here</title>
</head>
<body>
   <form action="${pageContext.request.contextPath }/FileUplaodSerlvet" method="post" enctype="multipart/form-data">
   用户名:<input type="text" name="uername" ><br>
   密码:<input type="password" name="password" ><br>
    <input type="file" name="file1" >上传文件<br>
   <input type="file" name="file2" >上传文件<br>
   <button>提交</button>
   </form>
</body>
</html>

FileIploadServlet

package com.fileupload;

import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Collection;

import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;

@WebServlet("/FileUplaodSerlvet")

//记得配置注解
@MultipartConfig
public class FileUplaodSerlvet extends HttpServlet {
    
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        response.getWriter().append("Served at: ").append(request.getContextPath());
    }

    
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //避免中文乱码
        request.setCharacterEncoding("UTF-8");
        response.setCharacterEncoding("UTF-8");
        response.setContentType("text/html;charset=utf-8");
        
        //获取存储路径
        String savepath=request.getServletContext().getRealPath("/upload");
        //因为我们的服务器上不确定是否有upload,所以
        File file=new File(savepath);
        if(!file.exists()) {
            file.mkdirs();
        }
        //获取上传文件集合
        Collection<Part> parts=request.getParts();
        if(file!=null) {
            for(Part part:parts) {
                //以为这里part获取的包括username,password,但是他们的类型为空,所以需要排除它们
                if(part.getContentType()!=null) {
                    //Servlet3.0将multipart/form-data的post的请求封装成Part,通过Part对文件上传操作。
                    //Servlet3没有提供直接获取文件名的方法,需要从请求头中解析出来
                    //获取请求头,请求头的格式:form-data;name="file";filenme="*******.zip"
                    
                    String header =part.getHeader("content-disposition");
                    //从请求头里获取文件名
                    String filename=getFileName(header);
                    //把文件写到指定路径
                    //File.separator系统兼容写法/或\\
                    part.write(savepath+File.separator+filename);
                    
                }
            }
            PrintWriter out =response.getWriter();
            out.println("上传成功");
            out.flush();
            out.close();
        }
    }
    private String getFileName(String header) {
        /**
         * String[] tempArr1 = header.split(";");代码执行完之后,在不同的浏览器下,tempArr1数组里面的内容稍有区别
         * 火狐或者google浏览器下:tempArr1={form-data,name="file",filename="snmp4j--api.zip"}
         * IE浏览器下:tempArr1={form-data,name="file",filename="E:\snmp4j--api.zip"}
         */
        String[] tempArr1=header.split(";");
        /**
         * 火狐或者google浏览器下:tempArr2={filename,"snmp4j--api.zip"}
         * IE浏览器下:tempArr2={filename,"E:\snmp4j--api.zip"}
         */
        String[] tempArr2=tempArr1[2].split("=");
        // 获取文件名,兼容各种浏览器的写法
        String filename=tempArr2[1].substring(tempArr2[1].lastIndexOf("\\")+1).replaceAll("\"","");
        return filename;
    }
}

查看服务器项目下的上情况E:\apache-tomcat-8.0.29\webapp\Demo0809\upload

二,下载文件

download.jsp

<%@ 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>Insert title here</title>
</head>
<body>
  <a href="${pageContext.request.contextPath }/download">下载</a>
</body>
</html>

DownloadServlet.java

package com.listener;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URLEncoder;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/download")
public class Download extends HttpServlet {
    
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        
        //设置服务器的响应为下载模式
        response.setContentType("application/x-msdownload");
        //设置文件下载后的名字
        String filename="1.jpg";
        //设置请求头的格式
        response.setHeader("content-Disposition", "attachment;filename="+URLEncoder.encode(filename,"UTF-8"));
        
        //设置从服务器下载的路径
        String url=request.getServletContext().getRealPath("/upload/")+"1.jpg";
        //设置输出流
        OutputStream out=response.getOutputStream();
        //设置输入从服务器上获取资源
        InputStream in=new FileInputStream(url);
        //设置缓冲区
        byte[] buffer=new byte[1024];
        
        int len=in.read(buffer);
        
        while(len!=-1) {
            out.write(buffer,0,len);
            len=in.read(buffer);
        }
        out.close();
        in.close();
        
        
    }

    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        doGet(request, response);
    }

}

下载结果

猜你喜欢

转载自www.cnblogs.com/liu-ya/p/9448581.html