使用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);
    }
}

猜你喜欢

转载自blog.csdn.net/defined_/article/details/120111465