圖片的截取上傳,終於寫出來了!


需要的包

項目的演示

項目的根目錄

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="width: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:\a\b\1.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="width: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({
                width: 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);
    }

}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM