1. 程式人生 > >Base64的Java服務端解壓縮圖片方法

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());
    }
}