Servlet-文件上传

Servlet文件上传

流程:

前台:
1. 提交方式:method:post
2. 文件编码:enctype="multipart/form-data" 【上传的为二进制文件
3. input内: 添加accept="image/*" 【可以确保上传的类型只能是图片

后台:
1. 导入2个jar包
1. commons-fileupload-1.4.jar
2. commons-io-2.6.jar
2. 前部分代码是固定写法,用来做一些准备工作。 直到遍历出Item,一个Item就是对应一个浏览器提交的数据,通过item.getInputStream可以打开浏览器上传的文件的输入流。
3. 客户提交的文件名有可能是一样的,所以在服务端保存文件的时候,不能使用客户提交的文件名。这里使用的是一种粗糙的解决文件名重复的办法,即使用时间戳。
4. 对于非文件字段如何处理:在遍历Item时(Item即对应浏览器提交的字段),可以通过item.isFormField

html:

<!DOCTYPE html>
<html lang="zh-CN">

<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>文件上传示例</title>
    <!-- Bootstrap -->
    <link href="css/bootstrap.min.css" rel="stylesheet">
    <script src="//cdn.bootcss.com/jquery/1.11.3/jquery.min.js"></script>
    <!--jquery-->
    <script src="js/bootstrap.min.js"></script>

    <style>
        div.upload_div{
            width:400px;
            margin:80px auto;
        }
        div.upload_type{
            height: 50px;
        }
    </style>
</head>

<body>

    <div class="workArea">
        <div class="upload_div">
            <form method="post" enctype="multipart/form-data" action="uploadServlet">
                <div class="panel panel-primary">
                    <div class="panel-heading">上传文件</div>
                    <div class="panel-body">
                        <div class="upload_type">
                            <span>选择文件类型</span>
                            <label>
                                <select name="imgType">
                                    <option value="big">大图</option>
                                    <option value="small">小图</option>
                                </select>
                            </label>
                        </div>
                        <input type="file" accept="image/*" name="imgPath">

                        <!--隐藏域-->
                        <input type="hidden" name="gid" value="12">
                        <input type="submit" value="提交">
                    </div>
                </div>
            </form>
        </div>
    </div>

</body>

</html>

Servlet类

/**
 item.isFormField
 * @author a_apple
 * @create 2019-12-08 14:59
 */
@WebServlet("/uploadServlet")
public class UploadServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //存储提交参数
        HashMap<String,String> params = new HashMap<>();
        String filename = null;
        try{
            DiskFileItemFactory factory = new DiskFileItemFactory();
            ServletFileUpload upload = new ServletFileUpload(factory);
            //设置上传文件大小的限制为1M
            factory.setSizeThreshold(1024 * 1024);

            List items = null;
            try {
                //获取浏览器提交的数据
                items = upload.parseRequest(request);
            }catch (FileUploadException e){
                e.printStackTrace();
            }

            Iterator iter = items.iterator();
            while(iter.hasNext()){
                FileItem item = (FileItem) iter.next();
                //文件部分
                if (!item.isFormField()) {

                    // 根据时间戳创建图片文件
                    filename = System.currentTimeMillis() + ".jpg";
                    //获取发布目录下img/big的真实路径
                    String imgFolder = request.getServletContext().getRealPath("img/big");
                    
                    System.out.println(imgFolder);
                    
                    File imgFile = new File(imgFolder, filename);
                    imgFile.getParentFile().mkdirs();

                    // 通过item.getInputStream()获取浏览器上传的文件的输入流
                    InputStream is = item.getInputStream();

                    // 复制文件
                    FileOutputStream fos = new FileOutputStream(imgFile);
                    byte arr[] = new byte[1024 * 1024];
                    int len = 0;
                    while ((len = is.read(arr)) != -1 ) {
                        fos.write(arr, 0, len);
                    }
                    fos.close();

                } else {
                    //非文件字段
                    String name = item.getFieldName();
                    String value = item.getString();
                    value = new String(value.getBytes("ISO-8859-1"), "UTF-8");

                    params.put(name,value);
                }
            }

            System.out.println("上传参数:"+params.toString());

            String html = "<img width='400px' src='img/big/"+filename+"' />";
            response.setContentType("text/html");
            response.getWriter().write(html);
        }catch (FileNotFoundException e){
            e.printStackTrace();
        }
    }

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

图片:在这里插入图片描述

在这里插入图片描述控制台:
在这里插入图片描述
上传图片的位置:
在这里插入图片描述

笔记

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值