Base64的Java服務端解壓縮圖片方法
阿新 • • 發佈:2019-02-10
/*
* 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());
}
}
* 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());
}
}