zoukankan      html  css  js  c++  java
  • 图片的截取上传,终于写出来了!

    需要的包

    项目的演示

    项目的根目录

    index.jsp

    <body>
    <!-- 用来上传图片 -->
    <form action="${pageContext.request.contextPath }/uploadPic" method="post" enctype="multipart/form-data">
            photo:<input type="file" name="photo"><br>
            <input type="submit" value="submit">
            
        </form><br>
        
        <!-- 用来接收截取后的图片 -->
        <div style="120px;height:120px;overflow:hidden;">
    
            <img src="cutImage/${mess}" height="120px" width="120px"/>
        </div>
    </body>

    对应的后台servlet代码,uploadPic.java

    package com.yunqing.servlet;
    
    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    import java.util.List;
    import java.util.Random;
    
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpSession;
    import javax.websocket.Session;
    
    import org.apache.tomcat.util.http.fileupload.FileItem;
    import org.apache.tomcat.util.http.fileupload.FileUploadException;
    import org.apache.tomcat.util.http.fileupload.RequestContext;
    import org.apache.tomcat.util.http.fileupload.disk.DiskFileItemFactory;
    import org.apache.tomcat.util.http.fileupload.servlet.ServletFileUpload;
    import org.apache.tomcat.util.http.fileupload.servlet.ServletRequestContext;
    
    
    public class uploadPic extends HttpServlet {
        
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            //得到文件上传的保存目录,放在WEB-INF下会更安全,但是不允许外界直接访问,所以放在根目录下的/image中
            String fileSavePath=this.getServletContext().getRealPath("/image");
            
            File file=new File(fileSavePath);
            //判断文件夹是否存在
            if(!file.exists()&&!file.isDirectory()){
                //不存在则创建
                file.mkdir();
            }
            //转发的消息
            String message="";
            //文件名+后缀名
            String fileNameAndExt="";
            
        try {
            //使用Apache文件上传组件处理文件上传步骤:
            //1、创建一个DiskFileItemFactory工厂
            DiskFileItemFactory factory=new DiskFileItemFactory();
            //2、创建一个文件上传解析器
            ServletFileUpload upload=new ServletFileUpload(factory);
            //解决上传文件名的中文乱码
            upload.setHeaderEncoding("UTF-8");
            //3、判断提交上来的数据是否是上传表单的数据
            if(!ServletFileUpload.isMultipartContent(request)){
                //按照传统方式获取数据
                return;
            }
            //4、使用ServletFileUpload解析器解析上传数据,解析结果返回的是一个List<FileItem>集合,每一个FileItem对应一个Form表单的输入项
                List<FileItem> list=upload.parseRequest((RequestContext) new ServletRequestContext(request));
                for (FileItem fileItem : list) {
                    //如果fileitem中封装的是普通输入项的数据
                    if(fileItem.isFormField()){//是普通的表单类型
                        String name=fileItem.getFieldName();
                        //解决普通输入项的数据的中文乱码问题
                        String value=fileItem.getString("UTF-8");
                        System.out.println(name+"="+value);
                    }else{//不是普通的表单类型,file类型
                        
                        //如果fileitem中封装的是上传文件
                        //得到上传的文件名称
                        String filename=fileItem.getName();
                        if(filename==null||"".equals(filename)){
                            continue;
                        }
                        //注意:不同的浏览器提交的文件名是不一样的,有些浏览器提交上来的文件名是带有路径的,如:  c:a1.txt,而有些只是单纯的文件名,如:1.txt
                        //处理获取到的上传文件的文件名的路径部分,只保留文件名部分
                        filename=filename.substring(filename.lastIndexOf("\")+1);
                        //获取后缀名
                        String fileExtName=filename.substring(filename.lastIndexOf(".")+1);
                        
                        System.out.println("文件的后缀名是"+fileExtName);
                        //获取item中的上传文件的输入流
                        InputStream is=fileItem.getInputStream();
                        
                        //FileOutputStream fos=new FileOutputStream(fileSavePath+"\"+filename);
                        
                        StringBuffer fileSaveName=this.fileSaveName();
                        
                        fileNameAndExt=fileSaveName+"."+fileExtName;
                        
                        System.out.println(fileNameAndExt);
                        //创建一个文件输出流            
                        FileOutputStream fos=new FileOutputStream(fileSavePath+"\"+fileSaveName+"."+fileExtName);    
                        //创建一个缓冲区
                        byte buffer[]=new byte[1024];
                        //判断输入流中的数据是否已经读完的标识
                        int len=0;
                        
                        //len=is.read(buffer);
                        //循环将输入流读入到缓冲区当中,(len=in.read(buffer))>0就表示in里面还有数据
                        while((len=is.read(buffer))>-1){
                            //使用FileOutputStream输出流将缓冲区的数据写入到指定的目录(savePath + "\" + filename)当中
                            fos.write(buffer, 0, len);
                        }
                        //关闭输入流
                        is.close();
                        //关闭输出流
                        fos.close();
                        //删除处理文件上传时生成的临时文件
                        fileItem.delete();
                        
                        message="文件上传成功";
                        message=fileNameAndExt;
                        
    
                    }
                }
            } catch (FileUploadException e) {
                // TODO Auto-generated catch block
                message="文件上传失败";
                e.printStackTrace();
            }
            request.setAttribute("message", message);
            request.getRequestDispatcher("/message.jsp").forward(request, response);
            
            HttpSession hs=request.getSession();
            hs.setAttribute("message", message);
        }
    /**
     * 给上传的文件命名    
     * @return
     */
        public StringBuffer fileSaveName(){
            StringBuffer dname=new StringBuffer();
            SimpleDateFormat sdf=new SimpleDateFormat("yyyyMMddHHmmssSSS");
            Date d=new Date();
            dname.append(sdf.format(d));
            
            //生成四位随机数
            Random random = new Random();
            for(int i=0;i<4;i++){
                dname.append(random.nextInt(10));
            }
            return dname;
        }
        
        public void doPost(HttpServletRequest request, HttpServletResponse response)
                      throws ServletException, IOException {
          
                 doGet(request, response);
             } 
    
    }

    截取的jsp页面

    <%@ page language="java" contentType="text/html; UTF-8"
        pageEncoding="UTF-8"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
    <title>Insert title here</title>
    <script src="js/jquery.min.js" type="text/javascript"></script>
        <script src="js/jquery-ui.min.js" type="text/javascript"></script>
        <script src="js/jquery.Jcrop.js" type="text/javascript"></script>
        <link rel="stylesheet" href="css/jquery-ui.css" type="text/css" />
        <link rel="stylesheet" href="css/jquery.Jcrop.css" type="text/css" />
    </head>
    <body>
        <img src="image/${message}" id="cutPic"><br>
        <h2>剪切预览:</h2>    
        <div style="120px;height:120px;overflow:hidden;">
    
            <img src="image/${message}" id="preview" class="jcrop-preview" height="120px" width="120px"/>
        </div><br>
        
        
        <form id="uploadSubForm" action="${pageContext.request.contextPath }/UploadSubImage" method="post">
              <div>
              <input type="text" size="4" id="startX" name="startX" />
              <input type="text" size="4" id="startY" name="startY" />
              <input type="text" size="4" id="endX" name="endX" />
              <input type="text" size="4" id="endY" name="endY" />
              <input type="text" size="4" id="width" name="width" />
              <input type="text" size="4" id="height" name="height" />
              </div>
              <input type="submit" id="uploadBtn" name="uploadBtn" value="submit" onclick="uploadSubImage()">
          </form>
    </body>
    <script type="text/javascript">
    jQuery(function($){
        var jcrop_api, boundx, boundy;
        
        $('#cutPic').Jcrop({
            onChange: updatePreview,
            onSelect: updatePreview,
            aspectRatio: 1
        },function(){
            // Use the API to get the real image size
            var bounds = this.getBounds();
            boundx = bounds[0];
            boundy = bounds[1];
            // Store the API in the jcrop_api variable
            jcrop_api = this;
        });
            
            function updatePreview(c)
              {
                  //得到坐标
                  $('#startX').val(c.x);
                  $('#startY').val(c.y);
                  $('#endX').val(c.x2);
                  $('#endY').val(c.y2);
                  $('#width').val(c.w);
                  $('#height').val(c.h);
    
                  //预览效果
                  if (parseInt(c.w) > 0)
                  {
                  var rx = 120 / c.w;
                  var ry = 120 / c.h;
    
                  $('#preview').css({
                     Math.round(rx * boundx) + 'px',
                    height: Math.round(ry * boundy) + 'px',
                    marginLeft: '-' + Math.round(rx * c.x) + 'px',
                    marginTop: '-' + Math.round(ry * c.y) + 'px'
                  });
                }
                  
              };
              //提交数据
                   function uploadSubImage() {
                    document.getElementById('uploadSubForm').submit();
                } 
    
    });
    </script>
    </html>

    截取的后台操作的servlet

    UploadSubImage.java
    package com.yunqing.servlet;
    
    import java.awt.Image;
    import java.awt.image.BufferedImage;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.IOException;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    import java.util.Random;
    
    import javax.imageio.ImageIO;
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpSession;
    
    
    public class UploadSubImage extends HttpServlet {
        //截取后的图片
        private static BufferedImage subImg;
        //转发的消息
        String mess="";
        
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            /*HttpSession hs=request.getSession();
            hs.setAttribute("message", message);*/
            //根据uploadPic中的上边两行代码,得到源图片文件的名称+后缀名
            HttpSession hs=request.getSession();
            
            String str=hs.getAttribute("message").toString();
            
            String srcFileName=this.getServletContext().getRealPath("/image")+"\"+str.toString();//得到上传的原图地址
            //得到后缀名
            String Ext=srcFileName.substring(srcFileName.lastIndexOf(".")+1);
            
            //System.out.println(request.getParameter("startX"));
            //剪切后的图片保存地址
            String cutImgSavePath=this.getServletContext().getRealPath("/cutImage");
            
            
            
            File file=new File(cutImgSavePath);
            
            if(!file.exists()&&!file.isDirectory()){
                file.mkdir();
            }
            //得到message.jsp传过来的截取尺寸
            int startX = Math.round(Float.parseFloat(request.getParameter("startX")));
            int startY = Math.round(Float.parseFloat(request.getParameter("startY")));
            int endX = Math.round(Float.parseFloat(request.getParameter("endX")));
            int endY = Math.round(Float.parseFloat(request.getParameter("endY")));
            int width = Math.round(Float.parseFloat(request.getParameter("width")));
            int height = Math.round(Float.parseFloat(request.getParameter("height")));
            System.out.println(startX + "==" + startY + "==" + endX + "==" + endY + "==" + width + "==" + height);
            //截图
            cut(srcFileName, startX, startY, width, height);
            //截图后的图片命名
            String cutName=this.cutImgFileName().toString();
            //保存
            save(Ext, cutName, cutImgSavePath, width, height);
            //传图片名称+后缀名
            mess=cutName+"."+Ext;
            
            request.setAttribute("mess", mess);
            request.getRequestDispatcher("index.jsp").forward(request, response);
            
        }
        
        public static void cut(String srcFileName,int startX,int startY,int width,int height){
            try {
                BufferedImage bufImg = ImageIO.read(new FileInputStream(srcFileName));
                subImg=bufImg.getSubimage(startX, startY, width, height);
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        
        public static void save(String imgExt,String imgName,String cutPath,int width,int height){
            UploadSubImage u=new UploadSubImage();
            try {/**压缩图片为指定尺寸*/
                if(subImg.getWidth()!=width || subImg.getHeight()!=height){
                    BufferedImage tempImg = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
                    tempImg.getGraphics().drawImage(subImg.getScaledInstance(width, height, Image.SCALE_SMOOTH), 0, 0,null);
                    ImageIO.write(tempImg, imgExt, new File(cutPath+"/"+imgName+"."+imgExt));
                }else{
                    ImageIO.write(subImg,imgExt,new File(cutPath+"/"+imgName+"."+imgExt));
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        
        
        public StringBuffer cutImgFileName(){
            StringBuffer dname=new StringBuffer();
            SimpleDateFormat sdf=new SimpleDateFormat("yyyyMMddHHmmssSSS");
            Date d=new Date();
            dname.append(sdf.format(d));
            
            //生成四位随机数
            Random random = new Random();
            for(int i=0;i<4;i++){
                dname.append(random.nextInt(10));
            }
            return dname;
        }
    
        /**
         * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
         */
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            // TODO Auto-generated method stub
            doGet(request, response);
        }
    
    }
  • 相关阅读:
    JavaScript之事件冒泡和事件捕获详细介绍
    jQuer配合CSS3实现背景图片动画
    jQuery中animate()的方法以及$("body").animate({"scrollTop":top})不被Firefox支持问题的解决
    JavaScript 运用之表单验证(正则)和控制输入长度。
    input[type=submit]以及数字日期在苹果手机上显示异常的处理
    webstorm 快捷键
    Bootstrap 折叠(Collapse)插件
    input输入内容时放大问题及处理
    省市二级联动(原生JS)
    Spring4.X——搭建
  • 原文地址:https://www.cnblogs.com/yunqing/p/7234308.html
Copyright © 2011-2022 走看看