JavaWeb学习总结——文件上传和下载

该博客详细介绍了如何使用Java Servlet处理文件上传。通过分析`UpImageServlet`类,展示了如何创建一个用于接收文件的表单,以及在后台处理上传的文件,包括创建保存目录、设置上传限制、解析上传数据、存储文件到服务器,并检查用户名是否存在。同时,文中还讨论了`<input>`和`<button>`标签在表单提交中的区别。
摘要由CSDN通过智能技术生成

原文借鉴:https://www.cnblogs.com/xdp-gacl/p/4200090.html,推荐关注
upImage.jsp中

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
    String basePath=request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+request.getContextPath();
%>
<%--解决相对路径出现错误问题,所以改为绝对路径--%>
<html>
<head>
    <title>Title</title>
</head>
<body>
<%--定义绝对路径,basePath --%>
<form action="<%=basePath%>/UpImageServlet" method="post" enctype="multipart/form-data" id="image">
    用户名:<input name="name" type="text"/>
    密码:<input name="password" type="password"/>
    <input name="image" type="file"/>
    <input value="提交" type="submit"/>
</form>

<%--<button onclick="toolTiJ()">提交</button>如果用button写会出现文件不存在的问题--%>

</body>
</html>
<%--button和input的区别
1、<input type="button" /> 这就是一个按钮。如果你不写javascript 的话,按下去什么也不会发生。
2、<input type="submit" /> 这样的按钮用户点击之后会自动提交 form,除非你写了javascript 阻止它。
3、<button>
 这个按钮放在 form
中也会点击自动提交,比前两个的优点是按钮的内容不光可以有文字,还可以有图片等多媒体内容。(当然,前两个用图片背景也可以做到)。它的缺点是不同的浏览器得到的
 value 值不同;可能还有其他的浏览器兼容问题。
4、其他标签,例如 a, img, span, div,然后用图片把它伪装成一个按钮--%>

UpImageServlet中

public class UpImageServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException {
        response.setContentType("text/html");
        response.setCharacterEncoding("UTF-8");
        //确认目录是否存在 无 创建
        String fileDir = request.getServletContext().getRealPath("/upload");
        File saveFile = new File(fileDir);//获取当前文件夹目录
        if (!saveFile.isDirectory() && !saveFile.exists()) {
            saveFile.mkdir();//不是文件夹 不存在 创建这个文件夹
        }
        //判断提交上来的数据是否是上传表单的数据  //按照传统方式获取数据
        if (ServletFileUpload.isMultipartContent(request)) {
            //使用Apache文件上传组件处理文件上传步骤:
            //创建一个DiskFileItemFactory工厂
            DiskFileItemFactory factory = new DiskFileItemFactory();
            //创建一个文件上传解析器
            ServletFileUpload upload = new ServletFileUpload(factory);
            //设置工厂的缓冲区的大小,当上传的文件大小超过缓冲区的大小时,就会生成一个临时文件存放到指定的临时目录当中。
            factory.setSizeThreshold(1024*100);// 设置缓冲区的大小为100KB,如果不指定,那么缓冲区的大小默认是10KB
            //设置上传单个文件的大小的最大值 1024*1024字节,也就是1MB 目前设置为40MB
            upload.setFileSizeMax(1024 * 1024 * 40);//
            //解决上传文件名的中文乱码 设置参数 设置文件编码
            upload.setHeaderEncoding("utf-8");
           // 4、使用ServletFileUpload解析器解析上传数据,解析结果返回的是一个List<FileItem>集合,每一个FileItem对应一个Form表单的输入项
            List<FileItem> list = null;
            try {
                list = upload.parseRequest(request);
            } catch (FileUploadException e) {
                e.printStackTrace();
            }
            HashMap<String, Object> hashMap = new HashMap<>();
            for (FileItem fileItem : list) {
                if (fileItem.isFormField()) {// 如果fileitem中封装的是普通输入项的数据
                    String name = fileItem.getFieldName();
                    //解决普通输入项的数据的中文乱码问题
                    String value = fileItem.getString("utf-8");//得到了姓名的name和它的值
                    hashMap.put(name, value);//局部变量改为全局变量存入数据库中
                } else {
                    //如果fileitem中封装的是上传文件//得到上传的文件名称,//得到图片元素
                    //处理相关的数据,把数据插入到数据后,先进行查重处理
                    String fileName = fileItem.getName();
                    if (fileName == null || fileName.trim().equals("")) {//trim方法去掉两端空格,判断fileName是否为空
                        continue;
                    }
 //注意:不同的浏览器提交的文件名是不一样的,有些浏览器提交上来的文件名是带有路径的,如:  c:\a\b\1.txt,而有些只是单纯的文件名,如:1.txt
                    //处理获取到的上传文件的文件名的路径部分,只保留文件名部分
                    //不为空 构建 文件的名称 用时间戳命名;
                    Long t1 = System.currentTimeMillis();
                    //文件的后缀
                    String t2 = fileName.substring(fileName.indexOf("."));
                    System.out.print(t2);
                    fileName = Long.toString(t1) + t2;//得到文件名称
                    //1.读取数据,用输入流 获取fileItem中的上传文件的输入流
                    InputStream in = fileItem.getInputStream();
                    byte[] buffer = new byte[1024];//缓冲区,读取的数据暂存
                    //创建一个标识len,用来判断数据是否读取完成
                    int len = 0;
                    //创建一个文件输出流
                    FileOutputStream out = new FileOutputStream(fileDir + "//" + fileName);
                    //循环将输入流读入到缓冲区当中,(len=in.read(buffer))>0就表示in里面还有数据
                    while ((len = in.read(buffer)) > 0) {
                        //使用FileOutputStream输出流将缓冲区的数据写入到指定的目录(fileDir + "//" + fileName)当中
                        out.write(buffer, 0, len);
                    }
                    //关闭输入流
                    in.close();
                    //关闭输出流
                    out.close();
                    //删除处理文件上传时生成的临时文件
                    fileItem.delete();
                    //保存文件路径 相对或hhttp.....
                    hashMap.put("image", fileDir + "//" + fileName);
                }
            }
            String name = (String) hashMap.get("name");
            String pw = (String) hashMap.get("password");
            String image = (String) hashMap.get("image");
            String sql = "select * from tooll where username='" + name + "' ";
            List<HashMap<String, Object>> list2 = new ArrayList<>();
            list2 = ShuJuKu.getList(sql);
            if (list.size() > 0) {
                response.getWriter().print("用户名已存在");
            }else{
                String sql2 = "insert into tooll(name,pw,image) values('" + name + "','" + pw + "','" + image + "')";
                int count;
                count = ShuJuKu.update(sql2);
                if (count > 0) {
                    response.getWriter().print("插入成功");
                } else {
                    response.getWriter().print("插入失败");
                }
            }
        }
    }

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

    }
}

各级结构如下:
UpImageServlet
upImage.jsp
common-fileupload包和common-io

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值