最近用到阿里云的oss存储图片数据,并且使用了图片处理功能,发现相关的技术文档都没有实例提供,我就把代码奉献出来喽。
主要的Control类
package com.zufangbao.earth.web.controller;
import java.io.File;
import java.io.FileOutputStream;
import java.sql.Timestamp;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.UUID;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import com.zufangbao.earth.util.ExceptionUtils;
import com.zufangbao.earth.util.UploadUtil;
import com.zufangbao.earth.web.controller.ImageControllerSpec.I_Get_Image_Key;
import com.zufangbao.gluon.spec.earth.MessageTable4Earth;
/**
* @author Xiepf
* 2015年12月21日
*/
@Controller
@RequestMapping(ImageControllerSpec.NAME)
public class ImageController {
@Autowired
private UploadUtil uploadUtil;
private static final Log logger = LogFactory.getLog(ImageController.class);
@RequestMapping(value = I_Get_Image_Key.NAME, method = RequestMethod.POST)
public HashMap<String, String> uploadImage(HttpServletRequest request, HashMap<String , Integer> parameters) {
FileOutputStream fos = null;
HashMap<String, String> urlMap = new HashMap<String, String>();
try {
MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
MultipartFile multipartFile = multipartRequest.getFile(I_Get_Image_Key.PARAM_IMAGE);
String key = multipartFile.getContentType();
Boolean isAllowType = IsAllowType(key);
if(!isAllowType){
logger.error("#uploadImage occur error, FileType is not allow!");
return null;
}
if(parameters.containsKey("width")==false && parameters.containsKey("hight")){
logger.error("#uploadImage occur error, width and hight should have one least!");
return null;
}
byte[] arr = multipartFile.getBytes();
String targetPath = getTargetPath();
File imageFile = new File(targetPath);
fos = new FileOutputStream(imageFile);
try {
fos.write(arr);
} finally {
if(null != fos){
fos.close();
}
}
UploadUtil.uploadImage(targetPath);
urlMap.put("original", UploadUtil.getAliYunUrl()+getFileName());
urlMap.put("thumbnail", uploadUtil.getThumbnail(getFileName(),parameters));
//System.out.println(urlMap);
return urlMap;
} catch (Exception e) {
int errCode = ExceptionUtils.getErrorCodeFromException(e);
String message = MessageTable4Earth.getMessage(errCode);
logger.error("#uploadImage occur error, code[" + errCode +" ],message["+message+"]", e.fillInStackTrace());
return null;
}
}
//判断图片格式是否合法
public Boolean IsAllowType(String key) {
String fileType = key.split("/")[1];
String[] formats = {"jpg","png","webp","bmp","jpeg"};
List<String> allowFormats = Arrays.asList(formats);
if(allowFormats.contains(fileType.toLowerCase()))return true;
else return false;
}
@Value("#{config['IMG_ROOT_PATH']}")
private String IMG_ROOT_PATH = "/temp";
private String imgUUID;
public String getTargetPath() {
imgUUID = UUID.randomUUID().toString();
String path = IMG_ROOT_PATH + format(getNowTimestamp(), I_Get_Image_Key.DEFAULT_DATE_PATTERN)+ "/";
File file =new File(path);
//如果文件夹不存在则创建
if (!file .exists() && !file .isDirectory()) {
file .mkdir();
}
path += getFileName();
return path;
}
private String getFileName() {
String fileName = imgUUID + I_Get_Image_Key.JPEG;
return fileName;
}
public static Timestamp getNowTimestamp(){
return new Timestamp(System.currentTimeMillis());
}
public static String format(Date date, String pattern){
DateFormat df = new SimpleDateFormat(pattern);
String s = df.format(date);
return s;
}
}
package com.zufangbao.earth.util;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Properties;
import java.util.Set;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PropertiesLoaderUtils;
import org.springframework.stereotype.Component;
import com.aliyun.oss.OSSClient;
import com.aliyun.oss.model.ObjectMetadata;
/**
* @author Xiepf 2015年12月21日
*/
@Component
public class UploadUtil {
private static final Log logger = LogFactory.getLog(UploadUtil.class);
private static final String ACCESS_ID = getValue("ACCESS_ID");
private static final String ACCESS_KEY = getValue("ACCESS_KEY");
private static final String BUCKET_NAME = getValue("BUCKET_NAME");
private static final String END_POINT = getValue("END_POINT");
private static final String PICTURE_SERVICE = getValue("PICTURE_SERVICE");
private static final String IMAGE_CONTENT_TYPE = "image/jpeg";
public static void uploadImage(String filePath) {
try {
File file = new File(filePath);
String key = file.getName();
String fileType = key.split("\\.")[1];
OSSClient client = new OSSClient(END_POINT, ACCESS_ID, ACCESS_KEY);
logger.debug("开始上传----->");
uploadImage(client, BUCKET_NAME, key, filePath, fileType);
logger.debug("上传完成----->");
} catch (IOException e) {
e.printStackTrace();
}
}
private static void uploadImage(OSSClient client, String bucketName,
String key, String uploadFilePath, String fileType)
throws IOException {
InputStream is = null;
File file = new File(uploadFilePath);
ObjectMetadata objectMeta = new ObjectMetadata();
objectMeta.setContentLength(file.length());
objectMeta.setContentType(IMAGE_CONTENT_TYPE);
try {
is = new FileInputStream(file);
client.putObject(bucketName, key, is, objectMeta);
} finally {
if (null != is) {
is.close();
}
}
}
private static final String HTTP = "http://";
private static final String POINT = ".";
private static final String AT = "@";
private static final String CONNECT = "_";
private static final String SEPARATOR = "/";
private static final String TYPE = ".jpg";
public static String getAliYunUrl() {
StringBuffer buffer = new StringBuffer();
buffer.append(HTTP).append(BUCKET_NAME).append(POINT).append(END_POINT)
.append(SEPARATOR);
return buffer.toString();
}
private static final HashMap<String, String> picuture_service_argument_mapping = new HashMap<String, String>() {
{
put("width", "w");
put("hight", "h");
put("quality", "q");
put("Quality", "Q");
put("multiple", "x");
put("immobilize", "i");
put("cut", "c");
put("edge", "e");
put("Orient", "o");
}
};
private static final String[] keys = {"width","hight","quality","Quality","multiple","immobilize","cut","edge","Orient"};
private static final List<String> keyList = Arrays.asList(keys);
/**
* 获得说略图URL,根据传入的Parameters参数
*/
public String getThumbnail(String fileName,
HashMap<String, Integer> parameters) {
StringBuffer buffer = new StringBuffer();
buffer.append(HTTP).append(BUCKET_NAME).append(POINT)
.append(PICTURE_SERVICE).append(SEPARATOR).append(fileName)
.append(AT);
StringBuffer paraString = new StringBuffer();
Set<String> keySet = parameters.keySet();
for (String key : keyList)
if(keySet.contains(key)){
String arugmentString = picuture_service_argument_mapping.get(key);
if (StringUtils.isEmpty(arugmentString))
continue;
paraString.append(CONNECT).append(
parameters.get(key).toString()
+ picuture_service_argument_mapping.get(key));
}
buffer.append(paraString.toString().substring(1, paraString.length()));
buffer.append(TYPE);
return buffer.toString();
}
private static final String OSS_PROPERTIES = "oss.properties";
public static String getValue(String key) {
Resource imgResource = new ClassPathResource(OSS_PROPERTIES);
try {
Properties properties = PropertiesLoaderUtils
.loadProperties(imgResource);
return properties.getProperty(key);
} catch (IOException e) {
e.printStackTrace();
return null;
}
}
}