使用Servlet上传下载文件

上传文件直接上代码:

首先是index.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<html>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<body>
    <form action="/UpLoadServlet" method="post" enctype="multipart/form-data">
        <input type="file" name="file">
        <input type="submit" name="upload" value="上传">
    </form>
</body>
</html>

然后是Servlet

package com.yf.Servlet.Demo;

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;
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;

@WebServlet("/UpLoadServlet")
//说明该Servlet是用来处理multipart/form-data类型的请求
@MultipartConfig
public class UpLoadServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setCharacterEncoding("utf-8");
        request.setCharacterEncoding("utf-8");
        PrintWriter printWriter = response.getWriter();
        //Servelt3.0中引入新方法,处理multipart/form-data类型编码的表单
        Part part = request.getPart("file");
        //获得HTTP头信息
        String headerInfo = part.getHeader("content-disposition");
        //System.out.println(headerInfo);//form-data; name="file"; filename="百度云盘.txt"
        //获取文件名
        String fileName = headerInfo.substring(headerInfo.lastIndexOf("=")+2,headerInfo.length()-1);
        //System.out.println(fileName);
        //获取存储上传文件的文件夹路径
        String fileSavingFolder = this.getServletContext().getRealPath("/UpLoad");
        //获得存储上传文件的完整路径(文件夹路径+文件名)
        String fileSavingPath = fileSavingFolder+ File.separator+fileName;//File.separator就是斜线
        //如果存储上传文件的文件夹不存在,则创建文件夹
        File file = new File(fileSavingFolder+File.separator);
        if(!file.exists()){
            file.mkdirs();
        }
        part.write(fileSavingPath);//将上传文件内容写入服务器文件中
        printWriter.println("文件上传成功!");
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request,response);
    }
}

步骤很简单,就是Part part = request.getPart(“file”);
part.write(“filename”);就是获得文件,然后把文件写入服务器。这里面有个小小的问题,我发现在不同的服务器中,String headerInfo = part.getHeader(“content-disposition”);得到的路径不一样,在谷歌浏览器是直接得到文件名,而IE得到的是文件的绝对路径,不过这个对我们没有影响。

下载文件:

package com.yf.Servlet.Demo;

import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.URLEncoder;

@WebServlet("/DownLoadServlet")
public class DownLoadServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("utf-8");
        response.setCharacterEncoding("utf-8");
        PrintWriter printWriter = response.getWriter();
        //文件的相对路径
        String filepath = "/WEB-INF/web.xml";
        //文件的绝对路径//D:\Servlet\target\Servlet\WEB-INF\text.txt
        String fullFilepath = request.getServletContext().getRealPath(filepath);
        //System.out.println(fullFilepath);
        //打开文件,创建File类型的文件对象
        File file = new File(fullFilepath);
        if(file.exists()){
            //获得文件名,并以UTF-8编码方式进行编码,以解决乱码
            String filename = URLEncoder.encode(file.getName(),"utf-8");
            //重置response
            response.reset();//清除首部空白行,清除缓存
            //设置文件的类型
            response.setContentType("text/xml");
            //设置HTTP头的内容
            response.addHeader("Content-Disposition","attachment:filename=\""+filename+"\"");
            //设置文件长度
            int fileLength = (int)file.length();
            response.setContentLength(fileLength);
            //如果文件长度大于0
            if(fileLength != 0){
                //创建输入流(read)将数据读入到程序
                FileInputStream fileInputStream = new FileInputStream(file);
                //设置缓存区
                byte[] buff = new byte[4096];
                //创建输出流(write)将数据输出程序
                ServletOutputStream servletOutputStream =  response.getOutputStream();
                int readLength;
                //fileInputStream.read(buff))的作用是将buff.lenght个字节的数据读入buff数组中
                while((readLength=fileInputStream.read(buff))!=-1){
                    //servletOutputStream.write(buff,0,readLength);的作用就是把buff中的数据输出到response
                    servletOutputStream.write(buff,0,readLength);
                }
                fileInputStream.close();
                servletOutputStream.flush();
                servletOutputStream.close();
            }
        }else{
            printWriter.println("文件不存在,请检查文件路径");
        }

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request,response);
    }
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值