JavaWeb 入门 简单上传、下载

JavaWeb上传下载

今天自学JavaWeb学到了上传和下载,在这里做一下记录。

首先创建一个新JavaWeb项目,先运行一下,然后在目录out\artifacts\web_war_exploded\下新建一个文件夹 res(用来存放上传后的文件),如图所示

在这里插入图片描述
然后上传需要先导入两个jar包,分别是:

下载后,放到项目中的WEB-INF目录下的 lib目录 中,右键jar包,使其变成一个library。
然后开始写代码
先展示一下目录结构:
在这里插入图片描述
这里把上传和下载简单化,代码只涉及了三个文件,一个jsp和两个Servlet

  • jsp:只是写了一个表单和一个下载超链接
<%-- Created by IntelliJ IDEA. --%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title></title>
  </head>
  <body>
  <form action="UploadServlet" method="post" enctype="multipart/form-data">
    学号:<input type="text" name="sno"><br/>
    姓名:<input type="text" name="sname"><br/>
    上传照片:<input type="file" name="picture" /><br/>
    <input type="submit" value="提交">
  </form>
  <a href="DownloadServlet?fileName=123.png">点击下载图片123.png</a>
  </body>
</html>
  • UploadServlet:处理上传的图片,并放到前面创建的res文件夹中
@WebServlet(value = "/UploadServlet")
public class UploadServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //设置编码格式
        request.setCharacterEncoding("utf-8");
        response.setContentType("text/html;charset=UTF-8");
        response.setCharacterEncoding("utf-8");
        //上传
        boolean isMultipart = ServletFileUpload.isMultipartContent(request);
        //判断是否有Multipart属性
        if (isMultipart) {
            DiskFileItemFactory factory = new DiskFileItemFactory();
            ServletFileUpload upload = new ServletFileUpload(factory);
            //设置上传临时文件大小,即缓冲区大小
            factory.setSizeThreshold(1024 * 10);
            //设置临时文件目录
            //factory.setRepository(new File(request.getSession().getServletContext().getRealPath("uploadTemp")));
            //控制上传文件大小
            upload.setSizeMax(1024 * 1024 * 3);
            try {
                //通过parseRequest解析form表单中的所有请求字段,并保存到items中
                List<FileItem> items = upload.parseRequest(request);
                Iterator<FileItem> iterator = items.iterator();
                while (iterator.hasNext()) {
                    FileItem item = iterator.next();
                    String itemName = item.getFieldName();
                    String sno = null;
                    String sname = null;
                    //判断前台字段 是普通form表单字段(sno,sname)还是文件字段
                    if (item.isFormField()){
                        if (itemName.equals("sno")) {
                            sno = item.getString("UTF-8");
                        } else if (itemName.equals("sname")) {
                            sname = item.getString("UTF-8");
                        } else {
                            System.out.println("其他字段");
                        }
                    } else {//文件字段
                        //获取文件名
                        String fileName = item.getName();
                        //判断文件类型
                        String ext = fileName.substring(fileName.indexOf(".") + 1);
                        if (!(ext.equals("png") || ext.equals("gif") || ext.equals("jpg"))) {
                            System.out.println("图片类型不对,只能为 png jpg gif 格式!");
                            return;//直接返回
                        }
                        //获取文件内容并上传
                        //定义文件路径:指定上传位置
                        String path = request.getSession().getServletContext().getRealPath("/res");
                        System.out.println(path);
                        File file = new File(path, fileName);
                        item.write(file);
                        System.out.println(fileName + "上传成功");
                        return;
                    }
                }
            } catch (FileUploadBase.SizeLimitExceededException e) {
                System.out.println("文件大小超过3MB!");
            } catch (FileUploadException e) {
                e.printStackTrace();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    }
}
  • DownloadServlet:从res中获取下载文件
@WebServlet(value = "/DownloadServlet")
public class DownloadServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //设置编码
        request.setCharacterEncoding("utf-8");
        //获取下载的文件名
        String fileName = request.getParameter("fileName");
        //获取文件路径
        String s = request.getSession().getServletContext().getRealPath("/res/")+fileName;
        System.out.println(s);
        //下载文件:需要设置消息头
        response.addHeader("contentType", "application/octet-stream");//二进制文件(任意类型
        response.addHeader("content-Disposition", "attachment;filename="+ URLEncoder.encode(fileName, "UTF-8"));
        //Servlet通过文件地址 将文件转为输入流 读到Servlet 中
        InputStream in = new FileInputStream(new File(s));
        //通过输出流 把文件输出给用户
        ServletOutputStream out = response.getOutputStream();
        byte[] bytes = new byte[1024];
        int len = -1;
        while ((len = in.read(bytes)) != -1) {
            out.write(bytes, 0, len);
        }
        out.close();
        in.close();
    }

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

如图,选择文件、点击提交后,会把图片上传到res文件夹中
在这里插入图片描述
在这里插入图片描述
之后点击超链接:弹出下载框
在这里插入图片描述
综上,一个简单的上传和下载就完成了。

不过这里超链接只能下载指定的某一个文件,可自行扩展。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值