Base64的Java服务端解压缩图片方法

/*
 * Copyright (c) Goldwind Corp.
 * All Rights Reserved.
 */
 

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.UUID;


import javax.servlet.http.HttpServletRequest;


import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;

 


import sun.misc.BASE64Decoder;


/**
 * 
 *
 * @version Fyz v1.0
 * @author Zhang Ran, 2018年5月7日
 */
@Service
public class FileUploadService {


    private static Logger logger = LoggerFactory.getLogger(FileUploadService.class);


    @Autowired
    private FileConfiguration fileConfiguration;


    /**
     * 用户文件上传
     * 
     * @param request
     * @return 日期/文件名, 比如 20180416/aa.jpg
     */
    public String uploadUserFile(HttpServletRequest request) {
        // 文件路径+文件名
        return uploadFile(request, fileConfiguration.getUserFilePath());
    }


    /**
     * 团队文件上传
     * 
     * @param request
     * @return 日期/文件名, 比如 20180416/aa.jpg
     */
    public String uploadTeamFile(HttpServletRequest request) {
        // 文件路径+文件名
        return uploadFile(request, fileConfiguration.getTeamFilePath());
    }


    /**
     * 团队logo 图片
     * 
     * @param request
     * @return 日期/文件名, 比如 20180416/aa.jpg
     */
    public String uploadTeamBase64File(String file, String type) {
        // 文件路径+文件名
        return uploadBase64File(file, fileConfiguration.getTeamFilePath(), type);
    }
    
    
    /**
     * 设计师文件上传
     * 
     * @param request
     * @return 日期/文件名, 比如 20180416/aa.jpg
     */
    public String uploadDesignerFile(HttpServletRequest request) {
        // 文件路径+文件名
        return uploadFile(request, fileConfiguration.getDesignerFilePath());
    }
    
    /**
     * 设计师 logo 图片
     * 
     * @param request
     * @return 日期/文件名, 比如 20180416/aa.jpg
     */
    public String uploadDesignerBase64File(String file, String type) {
        // 文件路径+文件名
        return uploadBase64File(file, fileConfiguration.getDesignerFilePath(), type);
    }


    /**
     * 项目文件上传
     * 
     * @param request
     * @return 日期/文件名, 比如 20180416/aa.jpg
     */
    public String uploadProjectFile(HttpServletRequest request) {
        // 文件路径+文件名
        return uploadFile(request, fileConfiguration.getProjectFilePath());
    }


    /**
     * 企业业主资质文件上传
     * 
     * @param request
     * @return 日期/文件名, 比如 20180416/aa.jpg
     */
    public String uploadOwnerEnterpriseFile(HttpServletRequest request) {
        // 文件路径+文件名
        return uploadFile(request, fileConfiguration.getOwnerEnterprisePath());
    }


    /**
     * 企业业主资质文件上传
     * 
     * @param request
     * @return 日期/文件名, 比如 20180416/aa.jpg
     */
    public String uploadOwnerPersonFile(HttpServletRequest request) {
        // 文件路径+文件名
        return uploadFile(request, fileConfiguration.getOwnerPersonPath());
    }


    /**
     * 文件上传,如果上传失败,返回“上传失败!”
     * 
     * @param request
     * @param fileRealPath 文件保存目录
     * @return 日期/文件名, 比如 20180416/aa.jpg
     */
    private String uploadFile(HttpServletRequest request, String fileRealPath) {


        MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;


        fileRealPath = fileRealPath + File.separator + DateUtil.getSystemDate();


        // 根据真实路径创建目录
        File fileSaveFile = new File(fileRealPath);


        if (!fileSaveFile.exists())
            fileSaveFile.mkdirs();


        // 页面控件的文件流
        MultipartFile multipartFile = multipartRequest.getFile("file");


        // 使用UUID生成文件名
        String uuid = UUID.randomUUID().toString() + '-' + multipartFile.getOriginalFilename();


        // 拼成完整的文件保存路径加文件
        String fileName = fileRealPath + File.separator + uuid;


        File file = new File(fileName);


        try {
            multipartFile.transferTo(file);
        } catch (IllegalStateException illegalStateException) {
            logger.error(illegalStateException.getMessage());
            throw new BusinessException("upload failed!");


        } catch (IOException iOException) {
            logger.error(iOException.getMessage());
            throw new BusinessException("upload failed!");
        }


        // 返回结果相对路径,日期/文件名
        return DateUtil.getSystemDate() + File.separator + uuid;
    }


    /**
     * 文件上传,如果上传失败,返回“上传失败!”
     * 
     * @param request
     * @param fileRealPath 文件保存目录
     * @return 日期/文件名, 比如 20180416/aa.jpg
     * @throws IOException
     */
    private String uploadBase64File(String file, String fileRealPath, String imageType) {


        fileRealPath = fileRealPath + File.separator + DateUtil.getSystemDate();


        // 使用UUID生成文件名
        String uuid = UUID.randomUUID().toString();


        // 根据真实路径创建目录
        File fileSaveFile = new File(fileRealPath);


        if (!fileSaveFile.exists())
            fileSaveFile.mkdirs();


        String imgFilePath = fileRealPath + File.separator + uuid + '.' + imageType;// 新生成的图片


        // 通过base64来转化图片
        BASE64Decoder decoder = new BASE64Decoder();
        // Base64解码
        byte[] imageByte = null;
        File imageFile = null;
        try {
            imageByte = decoder.decodeBuffer(file);
            for (int i = 0; i < imageByte.length; ++i) {
                if (imageByte[i] < 0) {// 调整异常数据
                    imageByte[i] += 256;
                }
            }
            imageFile = new File(imgFilePath);
            if (!imageFile.createNewFile()) {
                throw new InternalServerErrorException();
            }


        } catch (IOException e) {
            logger.error(e.getMessage());
        }


        try (OutputStream imageStream = new FileOutputStream(imageFile)) {
            imageStream.write(imageByte);
            imageStream.flush();
        } catch (Exception e) {
            logger.error(e.getMessage());
        }


        // 返回结果相对路径,日期/文件名
        return DateUtil.getSystemDate() + File.separator + uuid + '.' + imageType;
    }


    /**
     * 报名项目文件上传
     * 
     * @param request
     * @return 日期/文件名, 比如 20180416/aa.jpg
     */
    public String uploadRegistrationProjectFile(HttpServletRequest request) {
        return uploadFile(request, fileConfiguration.getRegistrationProjectFilePath());
    }
}

猜你喜欢

转载自blog.csdn.net/hanghangaidoudou/article/details/80742924