瀏覽代碼

头像上传成功后刷新主页

hurugang 6 年之前
父節點
當前提交
9f6697595a

+ 264 - 0
src/main/java/cn/hnthyy/thmz/Utils/ImageUtil.java

@@ -0,0 +1,264 @@
+package cn.hnthyy.thmz.Utils;
+
+import com.sun.image.codec.jpeg.JPEGCodec;
+import com.sun.image.codec.jpeg.JPEGEncodeParam;
+import com.sun.image.codec.jpeg.JPEGImageEncoder;
+import lombok.extern.slf4j.Slf4j;
+
+import java.awt.*;
+import java.awt.geom.Area;
+import java.awt.geom.RoundRectangle2D;
+import java.awt.image.BufferedImage;
+import java.io.*;
+import javax.imageio.ImageIO;
+
+/**
+ * 图片处理类
+ *
+ * @author sanshizi
+ */
+@Slf4j
+public class ImageUtil {
+
+    /**
+     * 针对高度与宽度进行等比缩放
+     *
+     * @param img
+     * @param maxSize 要缩放到的尺寸
+     * @param type    1:高度与宽度的最大值为maxSize进行等比缩放 , 2:高度与宽度的最小值为maxSize进行等比缩放
+     * @return
+     */
+    private static Image getScaledImage(BufferedImage img, int maxSize, int type) {
+        int w0 = img.getWidth();
+        int h0 = img.getHeight();
+        int w = w0;
+        int h = h0;
+        if (type == 1) {
+            w = w0 > h0 ? maxSize : (maxSize * w0 / h0);
+            h = w0 > h0 ? (maxSize * h0 / w0) : maxSize;
+        } else if (type == 2) {
+            w = w0 > h0 ? (maxSize * w0 / h0) : maxSize;
+            h = w0 > h0 ? maxSize : (maxSize * h0 / w0);
+        }
+        Image image = img.getScaledInstance(w, h, Image.SCALE_SMOOTH);
+        BufferedImage result = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB);
+        Graphics2D g = result.createGraphics();
+        g.drawImage(image, 0, 0, null);//在适当的位置画出  
+        return result;
+    }
+
+    /**
+     * 先按最小宽高为size等比例绽放, 然后图像居中抠出直径为size的圆形图像
+     *
+     * @param img
+     * @param size
+     * @return
+     */
+    private static BufferedImage getRoundedImage(BufferedImage img, int size) {
+        return getRoundedImage(img, size, size / 2, 2);
+    }
+
+    /**
+     * 先按最小宽高为size等比例绽放, 然后图像居中抠出半径为radius的圆形图像
+     *
+     * @param img
+     * @param size   要缩放到的尺寸
+     * @param radius 圆角半径
+     * @param type   1:高度与宽度的最大值为maxSize进行等比缩放 , 2:高度与宽度的最小值为maxSize进行等比缩放
+     * @return
+     */
+    private static BufferedImage getRoundedImage(BufferedImage img, int size, int radius, int type) {
+
+        BufferedImage result = new BufferedImage(size, size, BufferedImage.TYPE_INT_ARGB);
+        Graphics2D g = result.createGraphics();
+
+        //先按最小宽高为size等比例绽放, 然后图像居中抠出直径为size的圆形图像  
+        Image fixedImg = getScaledImage(img, size, type);
+        g.drawImage(fixedImg, (size - fixedImg.getWidth(null)) / 2, (size - fixedImg.getHeight(null)) / 2, null);//在适当的位置画出  
+
+        //圆角  
+        if (radius > 0) {
+            RoundRectangle2D round = new RoundRectangle2D.Double(0, 0, size, size, radius * 2, radius * 2);
+            Area clear = new Area(new Rectangle(0, 0, size, size));
+            clear.subtract(new Area(round));
+            g.setComposite(AlphaComposite.Clear);
+
+            //抗锯齿  
+            g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
+            g.fill(clear);
+            g.dispose();
+        }
+        return result;
+    }
+
+    /**
+     * 使用删除alpha值的方式去掉图像的alpha通道
+     *
+     * @param $image
+     * @return
+     */
+    protected static BufferedImage get24BitImage(BufferedImage $image) {
+        int __w = $image.getWidth();
+        int __h = $image.getHeight();
+        int[] __imgARGB = getRGBs($image.getRGB(0, 0, __w, __h, null, 0, __w));
+        BufferedImage __newImg = new BufferedImage(__w, __h, BufferedImage.TYPE_INT_RGB);
+        __newImg.setRGB(0, 0, __w, __h, __imgARGB, 0, __w);
+        return __newImg;
+    }
+
+    /**
+     * 使用绘制的方式去掉图像的alpha值
+     *
+     * @param $image
+     * @param $bgColor
+     * @return
+     */
+    protected static BufferedImage get24BitImage(BufferedImage $image, Color $bgColor) {
+        int $w = $image.getWidth();
+        int $h = $image.getHeight();
+        BufferedImage img = new BufferedImage($w, $h, BufferedImage.TYPE_INT_RGB);
+        Graphics2D g = img.createGraphics();
+        g.setColor($bgColor);
+        g.fillRect(0, 0, $w, $h);
+        g.drawRenderedImage($image, null);
+        g.dispose();
+        return img;
+    }
+
+    /**
+     * 将32位色彩转换成24位色彩(丢弃Alpha通道)
+     *
+     * @param $argb
+     * @return
+     */
+    public static int[] getRGBs(int[] $argb) {
+        int[] __rgbs = new int[$argb.length];
+        for (int i = 0; i < $argb.length; i++) {
+            __rgbs[i] = $argb[i] & 0xFFFFFF;
+        }
+        return __rgbs;
+    }
+
+    /**
+     * 将矩形转换成正方形
+     *
+     * @param img
+     * @param save
+     * @param size
+     * @throws IOException
+     */
+    public static void toJPG(File img, File save, Integer size) throws IOException {
+        if (size == null) {
+            size = 250;
+        }
+        FileOutputStream out = new FileOutputStream(save);
+        JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
+
+        BufferedImage image = getRoundedImage(ImageIO.read(img), size, 0, 2);//默认无圆角
+
+        //如果图像是透明的,就丢弃Alpha通道  
+        if (image.getTransparency() == Transparency.TRANSLUCENT) {
+            image = get24BitImage(image);
+        }
+        JPEGEncodeParam param = encoder.getDefaultJPEGEncodeParam(image);//使用jpeg编码器  
+        param.setQuality(1, true);//高质量jpg图片输出  
+        encoder.encode(image, param);
+
+        out.close();
+    }
+
+    /**
+     * 转换成png格式
+     *
+     * @param img
+     * @param save
+     * @param size
+     * @throws IOException
+     */
+    public static void toPNG(File img, File save, Integer size) throws IOException {
+        if (size == null) {
+            size = 250;
+        }
+        ImageIO.write(getRoundedImage(ImageIO.read(img), size, 0, 2), "PNG", save);//默认无圆角
+    }
+
+
+    /**
+     * 转换BufferedImage 数据为byte数组
+     *
+     * @param bImage Image对象
+     * @param format image格式字符串.如"gif","png"
+     * @return byte数组
+     */
+    public static byte[] imageToBytes(BufferedImage bImage, String format) {
+        ByteArrayOutputStream out = new ByteArrayOutputStream();
+        try {
+            ImageIO.write(bImage, format, out);
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        return out.toByteArray();
+    }
+
+    /**
+     * 转换byte数组为Image
+     *
+     * @param bytes
+     * @return Image
+     */
+    public static Image bytesToImage(byte[] bytes) {
+        Image image = Toolkit.getDefaultToolkit().createImage(bytes);
+        try {
+            MediaTracker mt = new MediaTracker(new Label());
+            mt.addImage(image, 0);
+            mt.waitForAll();
+        } catch (InterruptedException e) {
+            e.printStackTrace();
+        }
+
+        return image;
+    }
+
+
+    /**
+     * 将矩形转换成正方形 (字节数组)
+     *
+     * @param bytes 源码字节数组
+     * @param formatName 源文件格式
+     * @param size
+     * @throws IOException
+     */
+    public static byte[] formatToSquare(byte[] bytes, String formatName, Integer size) throws IOException {
+        ByteArrayOutputStream out = null;
+        if (size == null) {
+            size = 250;
+        }
+        try {
+            ByteArrayInputStream in = new ByteArrayInputStream(bytes);
+            BufferedImage image = getRoundedImage(ImageIO.read(in), size, 0, 2);//默认无圆角
+            //如果图像是透明的,就丢弃Alpha通道
+            if (image.getTransparency() == Transparency.TRANSLUCENT) {
+                image = get24BitImage(image);
+            }
+
+            out = new ByteArrayOutputStream();
+            ImageIO.write(image, formatName, out);
+            return out.toByteArray();
+        } catch (Exception e) {
+            log.error("图片转码失败,错误原因:{}", e.getMessage());
+        } finally {
+            if (out != null) {
+                out.close();
+            }
+        }
+        return null;
+    }
+
+
+    public static void main(String[] args) throws IOException {
+//        File img = new File("C:\\Users\\Administrator\\Desktop\\back.jpg");
+//        File save = new File("C:\\Users\\Administrator\\Desktop\\111111112.jpg");
+//        toJPG(img, save, 250);
+        System.out.println("back.jpg".substring("back.jpg".indexOf(".") + 1));
+    }
+}  

+ 30 - 25
src/main/java/cn/hnthyy/thmz/controller/FileController.java

@@ -1,11 +1,13 @@
 package cn.hnthyy.thmz.controller;
 
 
+import cn.hnthyy.thmz.Utils.ImageUtil;
 import cn.hnthyy.thmz.Utils.JsonUtil;
 import cn.hnthyy.thmz.Utils.TokenUtil;
 import cn.hnthyy.thmz.comment.UserLoginToken;
 import cn.hnthyy.thmz.entity.thmz.FileUpload;
 import cn.hnthyy.thmz.entity.thmz.User;
+import cn.hnthyy.thmz.enums.FileTypeEnum;
 import cn.hnthyy.thmz.service.thmz.FileUploadService;
 import cn.hnthyy.thmz.service.thmz.UserService;
 import com.auth0.jwt.interfaces.DecodedJWT;
@@ -22,6 +24,7 @@ import org.springframework.web.multipart.MultipartHttpServletRequest;
 
 import javax.servlet.http.HttpServletRequest;
 import java.util.Iterator;
+
 @Slf4j
 @RestController
 public class FileController {
@@ -30,13 +33,15 @@ public class FileController {
     private FileUploadService fileUploadService;
     @Autowired
     private UserService userService;
+
     /**
      * 根据主键下载文件
+     *
      * @param id
      * @return
      */
     @UserLoginToken
-    @RequestMapping(value = "/download",method = RequestMethod.GET )
+    @RequestMapping(value = "/download", method = RequestMethod.GET)
     public ResponseEntity<?> downloadFile(@RequestParam("id") Long id) {
         FileUpload fileUpload = fileUploadService.queryByid(id);
         if (fileUpload == null) {
@@ -48,29 +53,29 @@ public class FileController {
         try {
             primaryType = fileUpload.getMimeType().split("/")[0];
             subType = fileUpload.getMimeType().split("/")[1];
-        }
-        catch (IndexOutOfBoundsException | NullPointerException ex) {
+        } catch (IndexOutOfBoundsException | NullPointerException ex) {
             return new ResponseEntity<>("{}", HttpStatus.INTERNAL_SERVER_ERROR);
         }
-        headers.setContentType( new MediaType(primaryType, subType) );
+        headers.setContentType(new MediaType(primaryType, subType));
         return new ResponseEntity<>(fileUpload.getFile(), headers, HttpStatus.OK);
     }
 
 
     /**
      * 下载用户头像
+     *
      * @return
      */
     @UserLoginToken
-    @RequestMapping(value = "/download-profile",method = RequestMethod.GET )
+    @RequestMapping(value = "/download-profile", method = RequestMethod.GET)
     public ResponseEntity<?> downloadProfile(HttpServletRequest request) {
         String token = TokenUtil.getToken(request);
-        DecodedJWT decodedJWT=TokenUtil.parseJWT(token);
-        User tokenUser=(User)JsonUtil.jsontoObject(decodedJWT.getSubject(),User.class);
-        User user=userService.queryUserById(tokenUser.getId());
+        DecodedJWT decodedJWT = TokenUtil.parseJWT(token);
+        User tokenUser = (User) JsonUtil.jsontoObject(decodedJWT.getSubject(), User.class);
+        User user = userService.queryUserById(tokenUser.getId());
         FileUpload fileUpload = fileUploadService.queryByid(user.getProfileImage());
         if (fileUpload == null) {
-            return new ResponseEntity<>("{文件没有找到}", HttpStatus.NOT_FOUND);
+            return new ResponseEntity<>("{\"code\":-1,\"message\":\"文件没有找到\"}", HttpStatus.NOT_FOUND);
         }
         HttpHeaders headers = new HttpHeaders();
         headers.add("content-disposition", "attachment; filename=" + fileUpload.getFileName());
@@ -78,24 +83,22 @@ public class FileController {
         try {
             primaryType = fileUpload.getMimeType().split("/")[0];
             subType = fileUpload.getMimeType().split("/")[1];
+        } catch (IndexOutOfBoundsException | NullPointerException ex) {
+            return new ResponseEntity<>("{\"code\":-1}", HttpStatus.INTERNAL_SERVER_ERROR);
         }
-        catch (IndexOutOfBoundsException | NullPointerException ex) {
-            return new ResponseEntity<>("{}", HttpStatus.INTERNAL_SERVER_ERROR);
-        }
-        headers.setContentType( new MediaType(primaryType, subType) );
-        return new ResponseEntity<>(fileUpload.getFile(), headers, HttpStatus.OK);
+        headers.setContentType(new MediaType(primaryType, subType));
+        return new ResponseEntity<>(fileUpload.getSquareFile()!=null?fileUpload.getSquareFile():fileUpload.getFile(), headers, HttpStatus.OK);
     }
 
 
-
-
     /**
      * 文件上传
+     *
      * @param request
      * @return
      */
     @UserLoginToken
-    @RequestMapping( value = "/upload",method = RequestMethod.POST)
+    @RequestMapping(value = "/upload", method = RequestMethod.POST)
     public ResponseEntity uploadFile(MultipartHttpServletRequest request) {
         try {
             Iterator<String> itr = request.getFileNames();
@@ -107,21 +110,23 @@ public class FileController {
                 byte[] bytes = file.getBytes();
                 FileUpload newFile = new FileUpload(filename, bytes, mimeType);
                 String token = TokenUtil.getToken(request);
-                DecodedJWT decodedJWT=TokenUtil.parseJWT(token);
-                User tokenUser=(User)JsonUtil.jsontoObject(decodedJWT.getSubject(),User.class);
+                DecodedJWT decodedJWT = TokenUtil.parseJWT(token);
+                User tokenUser = (User) JsonUtil.jsontoObject(decodedJWT.getSubject(), User.class);
                 newFile.setCreateUser(tokenUser.getId());
                 String fileType = request.getHeader("fileType");
-                if(StringUtils.isNotBlank(fileType)){
+                if (StringUtils.isNotBlank(fileType)) {
                     newFile.setFileType(Integer.valueOf(fileType));
+                    if (FileTypeEnum.PROFILE_IMAGE.code.equals(newFile.getFileType())) {
+                        newFile.setSquareFile(ImageUtil.formatToSquare(bytes, filename.substring(filename.indexOf(".") + 1), null));
+                    }
                 }
                 fileUploadService.saveUploadFile(newFile);
             }
+        } catch (Exception e) {
+            log.error("文件上传失败,错误原因:{}", e.getMessage());
+            return new ResponseEntity<>("{\"code\":-1}", HttpStatus.INTERNAL_SERVER_ERROR);
         }
-        catch (Exception e) {
-            log.error("文件上传失败,错误原因:{}",e.getMessage());
-            return new ResponseEntity<>("{}", HttpStatus.INTERNAL_SERVER_ERROR);
-        }
-        return new ResponseEntity<>("{}", HttpStatus.OK);
+        return new ResponseEntity<>("{\"code\":0}", HttpStatus.OK);
     }
 
 }

+ 2 - 1
src/main/java/cn/hnthyy/thmz/entity/thmz/FileUpload.java

@@ -23,7 +23,8 @@ public class FileUpload {
     private Date createTime;
     //创建人
     private Long createUser;
-
+    //转码成方形的字节数组
+    private byte[] squareFile;
     public FileUpload(String fileName, byte[] file, String mimeType) {
         this.file = file;
         this.fileName = fileName;

+ 36 - 0
src/main/java/cn/hnthyy/thmz/enums/FileTypeEnum.java

@@ -0,0 +1,36 @@
+package cn.hnthyy.thmz.enums;
+
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * 文件类型
+ */
+public enum FileTypeEnum {
+    PROFILE_IMAGE(0,"头像"),
+    ID_CARD_FRONT(1,"身份证正面"),
+    ID_CARD_BACK(2,"身份证背面");
+
+    public Integer code;
+    public String name;
+
+    FileTypeEnum(Integer code, String name){
+        this.code=code;
+        this.name=name;
+    }
+
+    /**
+     * 根据编码查询对应的类型
+     * @param code
+     * @return
+     */
+    public static FileTypeEnum getFileTypeByCode(String code){
+        List<FileTypeEnum> fileTypeList= Arrays.asList(values());
+        for (FileTypeEnum fileType:fileTypeList){
+            if(fileType.code.equals(code)){
+                return fileType;
+            }
+        }
+        return null;
+    }
+}

+ 3 - 3
src/main/java/cn/hnthyy/thmz/mapper/thmz/FileUploadMapper.java

@@ -14,7 +14,7 @@ public interface FileUploadMapper {
      * @param id 主键
      * @return
      */
-    @Select("select id,file_name, file, file_type, mime_type, create_time, create_user from t_file_upload where id=#{id}")
+    @Select("select id,file_name, file, file_type, mime_type, create_time, create_user,square_file from t_file_upload where id=#{id}")
     FileUpload selectUserById(@Param("id") Long id);
     /**
      * 新增文件
@@ -22,8 +22,8 @@ public interface FileUploadMapper {
      * @param fileUpload
      * @return
      */
-    @Insert("INSERT INTO t_file_upload(file_name, file, file_type, mime_type, create_time, create_user) VALUES " +
-            "(#{fileName,jdbcType=VARCHAR}, #{file,jdbcType=BLOB}, #{fileType,jdbcType=CHAR}, #{mimeType,jdbcType=VARCHAR}, #{createTime,jdbcType=TIMESTAMP},#{createUser,jdbcType=BIGINT})")
+    @Insert("INSERT INTO t_file_upload(file_name, file, file_type, mime_type, create_time, create_user,square_file) VALUES " +
+            "(#{fileName,jdbcType=VARCHAR}, #{file,jdbcType=BLOB}, #{fileType,jdbcType=CHAR}, #{mimeType,jdbcType=VARCHAR}, #{createTime,jdbcType=TIMESTAMP},#{createUser,jdbcType=BIGINT}, #{squareFile,jdbcType=BLOB})")
     @Options(useGeneratedKeys = true, keyProperty = "id", keyColumn = "id")
     int insertFileUpload(FileUpload fileUpload);
 }

+ 18 - 4
src/main/resources/static/js/menu.js

@@ -19,10 +19,24 @@ $(function (){
     /**
      *初始化文件上传框
      */
-    $("#mydropzone").dropzone({
-        url: "/thmz/upload",
-        headers:{'Accept': 'application/json','Authorization':'Bearer '+ localStorage.getItem("token"),'fileType':localStorage.getItem("fileType")}
-    });
+    try {
+        $("#mydropzone").dropzone({
+            url: "/thmz/upload",
+            headers:{'Accept': 'application/json','Authorization':'Bearer '+ localStorage.getItem("token"),'fileType':localStorage.getItem("fileType")},
+            init: function() {
+                this.on("success", function(file,data) {
+                    if(data.code==0){
+                        if(localStorage.getItem("fileType")==0){
+                            window.location.href='/thmz/menu/view'
+                        }
+                    }
+                });
+            },
+        });
+    } catch(e) {
+       console.error("出现一些未知错误")
+    }
+
 
 
     imgFun("/thmz/download-profile", "headImage,headImage1,headImage2,headImage3,headImage4,headImage5");

+ 9 - 1
src/main/resources/static/js/profile.js

@@ -77,4 +77,12 @@ function profileInfo() {
     $("#userName").attr("readonly","readonly").removeAttr("required");
     $("#email").attr("readonly","readonly").removeAttr("required");
     $("#phoneNumber").attr("readonly","readonly").removeAttr("required");
-}
+}
+
+
+
+
+
+
+
+