JAVAWeb GET,POST,文件上传下载,验证码功能实现

(1) get,post数据的请求
     get,post数据的响应

(2) 文件上传
     文件下载

(3) 文字转图片,验证码简单实现
     图片下载

一. get,post数据的请求与响应

对loginServlet发起POST请求
<! doctype html>
<html>
    <head>
        <meta http-equiv="content-type" content="text/html;charset=UTF-8" >
        <title>登录</title>
    </head>

    <body>
        <form action="login" method="POST">
            <table>
                <tr>
                    <td>User Name:</td>
                    <td><input type="text" name="username"></td>
                </tr>
                <tr>
                    <td>Password:</td>
                    <td><input type="password" name="password"></td>
                </tr>
                <tr>
                    <td><input type="submit" name="submit"></td>
                    <td><input type="reset" name="reset"></td>
                </tr>
            </table>
        </form>
    </body>
</html>
    Web服务器接受到POST请求之后:
    1. request.setCharacterEncoding("utf-8");设置请求数据的编码,防止中文乱码;
    2. request.getParameter("username");获取请求参数;
    3. response.setContentType("text/html;charset=utf-8");设置响应体编码
    4. PrintWriter out = response.getWriter();
        out.println("name: "+name+"<br>"); 返回给浏览器数据;

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub

        request.setCharacterEncoding("utf-8");
        System.out.println(getServletContext().getRealPath("hehe"));

        //处理中文乱码问题
        String name = request.getParameter("username");
        String pwd  = request.getParameter("password");

        System.out.println("name: "+name);
        System.out.println("password: "+pwd);

        //GET,POST数据响应
        response.setContentType("text/html;charset=utf-8");
        PrintWriter out = response.getWriter();
        out.println("name: "+name+"<br>");
        out.println("password: "+pwd+"<br>");
        out.close();
    }
  关于POST,GET请求与响应中出现的乱码问题处理
      1. APPWeb获取GET请求参数乱码问题
         因为GET的参数已经被Tomcat预处理过,所以只能通过字符串转编码   new String(       name.getBytes("ISO-8859-1"), "UTF-8" );

     2. APPWeb获取POST请求参数乱码问题
        (1) html页面设置  meta http-equiv="Content-Type" content="text/html" 保证传输的参数为UTF-8编码。
        (2) APPWeb端默认编码是ISO-8859-1编码,我们需要设置为request.setCharacterEncoding("utf-8");即可

    3. 浏览器显示响应乱码问题
        响应体设置编码:response.setContentType("text/html;charset=utf-8");                                                 

二. 文件上传与下载

文件上传功能

    /**
     *   上传文件步骤:
     *   
     *   1.public void init( ServletConfig config ) throws ServletException 中设置上传文件目录
     *   2. 创建DiskFileItemFactory对象; 
     *      2.1 设置硬盘写数据时的缓存区大小  factory.setSizeThreshold(10*1024);
     *      2.2 设置临时目录   factory.setRepository(new File(tempFilePath));
     *   3. 创建文件上传对象:
     *      3.1 ServletFileUpload upload = new ServletFileUpload( factory ); //factory为DiskFileItemFactory对象;
     *      3.2 设置允许上传文件的最大尺寸,超过就会报异常upload.setSizeMax(100*1024*1024); 
     *   4. upload对象 解析request,将上传的数据,文件转变为FileItem列表  List parseRequest = (List)upload.parseRequest(request);
     *   5. 根据item.isFormField()判断是普通的表单,还是文件,来进行不同的解析;
     *   6. 普通的表单处理
     *          String name = item.getFieldName(); //获取表单项的name
                String value=null;
                value = new String( item.getString().getBytes("ISO-8859-1"), "UTF-8" );
         7. 文件表单处理      
                //获取上传到服务器的路径
                String filename = item.getName();   
                System.out.println( filename );
                int  index = filename.lastIndexOf("\\");
                //截取出文件名
                filename = filename.substring(index+1, filename.length() );
                long fileSize = item.getSize(); //文件的大小

                if( filename.endsWith("") && fileSize==0 ) {
                    return;
                }

                File uploadFile = new File( filePath+"/"+filename );
                System.out.println( uploadFile.getPath() );
                //将客户端上传的文件写入到指定路径的文件中
                item.write(uploadFile);    
     * */
     代码:
     protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub

        response.setContentType("text/html;charset=utf-8");
        response.setCharacterEncoding("UTF-8");


        //定义向客户端发送响应正文的out
        PrintWriter out = response.getWriter();
        out.println("<html><head><title>上传成功</title></head><body>");

        //创建一个基于硬盘的FileItem工厂
        DiskFileItemFactory factory = new DiskFileItemFactory();
        //设置向硬盘写数据时所用的缓存区大小,此处为4k
        factory.setSizeThreshold(10*1024);
        //设置临时目录
        factory.setRepository(new File(tempFilePath));

        //创建一个文件上传处理器
        ServletFileUpload upload = new ServletFileUpload( factory );
        //设置允许上传的文件的最大尺寸 100M
        upload.setSizeMax(100*1024*1024);

        try {
            List parseRequest = (List)upload.parseRequest(request);
            int length = parseRequest.size();
            for( int i=0; i<length; i++ ) {

                FileItem item = (FileItem)parseRequest.get(i);
                if( item.isFormField() ) { //普通的表单嘻嘻
                        processFromField( item, response.getWriter() );
                }else { //上传的是文件信息
                        try {
                            processUploadedFile( item , response.getWriter() );
                        } catch (Exception e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
                }
            }

        } catch (FileUploadException e) {

            e.printStackTrace();

        } //从request取出表单数据


        out.println("<a href=\"/helloApp/upload.jsp\">继续上传文件</a> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"
                + "<a href=\"/helloApp\">查看下载列表</a>");
        out.println("</body></html>");
    }

    /** 上传的是普通的表单数据 */
    private void processFromField( FileItem item, PrintWriter out ) {

        String name = item.getFieldName(); //获取表单项的name
        String value=null;
        try {
            value = new String( item.getString().getBytes("ISO-8859-1"), "UTF-8" );
        } catch (UnsupportedEncodingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }    //获取表单项的value
    }


    /** 上传的Item是 文件 */
    private void processUploadedFile( FileItem item, PrintWriter out ) throws Exception {

        //获取上传到服务器的路径
        String filename = item.getName();   
        System.out.println( filename );
        int  index = filename.lastIndexOf("\\");
        //截取出文件名
        filename = filename.substring(index+1, filename.length() );
        long fileSize = item.getSize(); //文件的大小

        if( filename.endsWith("") && fileSize==0 ) {
            return;
        }

        File uploadFile = new File( filePath+"/"+filename );
        System.out.println( uploadFile.getPath() );
        //将客户端上传的文件写入到指定路径的文件中
        item.write(uploadFile);
        out.println( filename+" is saved <br>" );
        out.println( "The size of "+filename + " is "+fileSize +""
                + "<br>");
    }

文件下载功能

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


        //根据文件名来下载文件
        String fileName = request.getParameter("fileName");
        System.out.println("需要下载的文件: "+fileName);
        //1.获取Store下的文件内容
        InputStream  in = getServletContext().getResourceAsStream("/store/"+fileName);
        if ( in == null ) {
            response.getWriter().println("文件不存在!");
            return;
        }

        OutputStream out = response.getOutputStream(); //因为是文件,所以采用字节流传输数据,可以防止二进制丢失
        int length = in.available();
        //2.设置请求头   1.设置MIMIE  2.设置content-length 3.设置content-disposition attachment
        response.setHeader("Content-Type", "application/force-download");
        response.setHeader("Content-Length", ""+length );
        response.setHeader("Content-Disposition", "attachment;filename="+new String(fileName.getBytes("UTF-8"),"ISO-8859-1"));

        //3.输出流
        byte[] buffer = new byte[512];
        int byteReadSize = -1;
        while( (byteReadSize = in.read(buffer)) != -1 ) {

            out.write(buffer, 0, byteReadSize );
        }
        out.close(); //传输完成
    }

三. 文字转图片,生成验证码

        /**
         *  servlet将文字生成图片步骤:
         *  (1) 设置MIME类型为  image/jpeg
         *         response.setContentType("image/jpeg");//设置MIME类型
         *  
         *  (2) 创建画布,设置画布的大小       
         *             BufferedImage image = new BufferedImage(12*length, 16, BufferedImage.TYPE_INT_RGB);
         *  
         *  (3) 获取画布的画笔 
         *         Graphics g = image.getGraphics();
         *      设置当前画笔颜色   
         *             g.setColor(Color.getColor("#CCCCCC"));
         *          画一个黑色矩形当做背景
         *             g.fillRect(0, 0, 12*length, 16); //在画布上画个黑色的矩形,因为值一样,所以完全占据画布大小;
         *      画线条 
         *             int width =  12*length;
                   int height = 16;
                   g.drawLine(1, 1,  width, height);
                   g.drawLine(1, height, width, 1); 
                画文字
                //设置字体
                   g.setColor(Color.green);
                   Font font = new Font("Couorie", Font.BOLD, 14);
                   g.setFont(font);

                   char c;
                   for( int i=0; i<length; i++ ) {
                   c = count.charAt(i);
                   g.drawString(c+"", i*12+1, 14);

                 关闭
                   g.dispose();

             (4) image转成图片文件,并且输出给浏览器        
                   ImageIO.write(image, "jpeg", out);
                   out.close();     
         * */
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        /**
         *  servlet将文字生成图片
         *  
         * 
         * */

        String count = "123456789";
        if( count==null ) { count = "1"; }
        int length = count.length();

        response.setContentType("image/jpeg");//设置MIME类型
        ServletOutputStream out = response.getOutputStream(); //字节流输出对象

        //1. 创建一个位于缓存中的画布,长度为12*length, 高为16.
        BufferedImage image = new BufferedImage(12*length, 16, BufferedImage.TYPE_INT_RGB);
        //2. 获取Graphics画笔
        Graphics g = image.getGraphics(); 
        //设置画笔颜色
        g.setColor(Color.getColor("#CCCCCC"));
        //3.画一个灰色的矩形 长度为12*length,高度为16
        g.fillRect(0, 0, 12*length, 16); //在画布上画个黑色的矩形,因为值一样,所以完全占据画布大小;
        //再次设置画笔颜色
        g.setColor(Color.red);

        //设置*
        int width =  12*length;
        int height = 16;
        g.drawLine(1, 1,  width, height);
        g.drawLine(1, height, width, 1);

        //设置字体
        g.setColor(Color.green);
        Font font = new Font("Couorie", Font.BOLD, 14);
        g.setFont(font);

        char c;
        for( int i=0; i<length; i++ ) {
            c = count.charAt(i);
            g.drawString(c+"", i*12+1, 14);
        }
        g.dispose();

        ImageIO.write(image, "jpeg", out);
        out.close();
    }

—————– 本篇博客已完结 ———————

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
文件上传下载是Web应用程序中常见的功能之一,下面给出一个简单的JavaWeb实现: 1. 文件上传 在JSP页面中,需要一个表单,用于选择文件并提交: ```html <form action="upload" method="post" enctype="multipart/form-data"> <input type="file" name="file"> <input type="submit" value="Upload"> </form> ``` 在Servlet中,处理文件上传的代码如下: ```java protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 获取上传的文件 Part filePart = request.getPart("file"); String fileName = getFileName(filePart); // 保存上传的文件 OutputStream out = new FileOutputStream(new File("D:/uploads/" + fileName)); InputStream in = filePart.getInputStream(); byte[] buffer = new byte[1024]; int length = -1; while ((length = in.read(buffer)) != -1) { out.write(buffer, 0, length); } in.close(); out.close(); // 返回上传成功的信息 response.setContentType("text/html;charset=utf-8"); PrintWriter writer = response.getWriter(); writer.println("上传成功!"); } // 获取上传的文件名 private String getFileName(Part part) { String contentDisposition = part.getHeader("content-disposition"); String[] tokens = contentDisposition.split(";"); for (String token : tokens) { if (token.trim().startsWith("filename")) { return token.substring(token.indexOf("=") + 2, token.length() - 1); } } return ""; } ``` 2. 文件下载 在JSP页面中,需要一个超链接,用于触发文件下载: ```html <a href="download?fileName=test.txt">Download</a> ``` 在Servlet中,处理文件下载的代码如下: ```java protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 获取要下载的文件名 String fileName = request.getParameter("fileName"); // 设置响应头,告诉浏览器下载文件 response.setContentType("application/octet-stream"); response.setHeader("Content-Disposition", "attachment;filename=" + new String(fileName.getBytes("utf-8"), "iso8859-1")); // 读取要下载的文件并写入响应流 InputStream in = new FileInputStream(new File("D:/uploads/" + fileName)); OutputStream out = response.getOutputStream(); byte[] buffer = new byte[1024]; int length = -1; while ((length = in.read(buffer)) != -1) { out.write(buffer, 0, length); } in.close(); out.close(); } ``` 以上就是JavaWeb实现文件上传下载的简单示例,需要注意的是上传的文件保存在服务器的硬盘上,因此需要确保上传的文件不会对服务器造成安全威胁,如上传病毒文件、木马等。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值