使用Servlet实现文件的上传和下载

首先需要两个jar包:

下载commons-fileupload-1.2.2-bin.zip:

http://commons.apache.org/proper/commons-fileupload/download_fileupload.cgi

下载commons-io-2.11.0-bin.zip:

http://commons.apache.org/proper/commons-io/download_io.cgi

下载好之后将两个包都放入WEB-INF目录下新建的ib文件夹中,并右键单击将其“Add As Library”。

接下来,在jsp页面中,需要一个form表单。

注意以下几点:

        1.  form标签,method必须为post(无长度限制)

        2.  form标签的enctype属性值必须为multipart/form-data。表示提交的数据以多段进行拼                     接, 并且以二进制的形式发送。

        3.  使用type = “file” 进行文件上传。

然后开始编写服务器接收代码,处理上传的文件。创建一个继承HttpServlet的类,并在web.xml配置。

配置如下:

 在jsp页面中,设置form表单的action属性值为“http://localhost:8080/TestDemo/upload”,这里的/upload对应刚刚配置的路径。

源码如下:

upload.jsp

    <form action="http://localhost:8080/TestDemo/upload" method="post" enctype="multipart/form-data">
        username:<input type="text" name="name"/>
        <br>
<%--        使用<input type="file"/>添加文件上传--%>
        <input type="file" name="photo"/><br>
        <input type="submit">
    </form>

 upload.java

public class upload extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        if(ServletFileUpload.isMultipartContent(req)){
            //需要一个fileItemFactory实例  fileItemFactory是一个接口  因此new的是它的实现类
            FileItemFactory fileItemFactory=new DiskFileItemFactory();
            //创建一个用于解析上传数据的类
            ServletFileUpload servletFileUpload=new ServletFileUpload(fileItemFactory);

            try {
                //解析上传的数据  得到每一个表单项FileItem
                List<FileItem> list=servletFileUpload.parseRequest(req);
                //循环判断每个表单项
                for(FileItem fileItem : list){
                    if(fileItem.isFormField()){
                        //普通表单项
                        System.out.println("表单的name属性:"+fileItem.getFieldName());
                        System.out.println("表单的value属性"+fileItem.getString("UTF-8"));
                    }else{
                        //上传的文件
                        System.out.println("表单的name属性:"+fileItem.getFieldName());
                        System.out.println("上传的文件名:"+fileItem.getName());
                        //上传的文件写入E盘
                        fileItem.write(new File("e:\\"+fileItem.getName()));
                    }

                }
            } catch (FileUploadException e) {
                e.printStackTrace();
            } catch (Exception e) {
                e.printStackTrace();
            }

        }
    }
}

运行结果如下:

下载:

需要提前将要用的图片部署在项目中:

创建一个继承HttpServlet的类,重写doGet方法 :

public class download extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取下载的文件名 这里写死
        String downloadFileName="1.jpg";
        //读取下载的内容
        ServletContext servletContext=getServletContext();
        //获取要下载的文件类型
        String mimeType=servletContext.getMimeType("/img/"+downloadFileName);
        System.out.println("下载的文件类型"+mimeType);
        //通过响应头告诉客户端返回的数据类型
        resp.setContentType(mimeType);
        //告诉客户端收到的数据用于下载 如果没有这一项 图片将直接显示在页面中
        resp.setHeader("Content-Disposition","attachment;filename="+downloadFileName+"");
        //输入流
        InputStream resourceAsStream=servletContext.getResourceAsStream("/img/"+downloadFileName);
        //获取响应的输出流
        OutputStream outputStream=resp.getOutputStream();
        //将前者输入的流的内容读取,写给后者输出流
        IOUtils.copy(resourceAsStream,outputStream);
    }
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值