java实现文件上传oss服务

版权声明:未经允许禁止转载、转发 https://blog.csdn.net/qq_22764659/article/details/87969743

java实现文件上传oss服务

首先是pom.xml引入对应的jar包

	<!-- OSS文件上传 start -->
	<dependency>
		<groupId>commons-httpclient</groupId>
		<artifactId>commons-httpclient</artifactId>
		<version>3.1</version>
		<exclusions>
			<exclusion>
				<groupId>commons-codec</groupId>
				<artifactId>commons-codec</artifactId>
				<!--<version>1.2</version> -->
			</exclusion>
		</exclusions>
	</dependency>
	<dependency>
		<groupId>commons-fileupload</groupId>
		<artifactId>commons-fileupload</artifactId>
		<version>1.3.1</version>
	</dependency>
	<dependency>
		<groupId>commons-io</groupId>
		<artifactId>commons-io</artifactId>
		<version>2.5</version>
	</dependency>
	<dependency>
		<groupId>com.alibaba</groupId>
		<artifactId>druid</artifactId>
		<version>1.1.6</version>
	</dependency>
	<!-- 支付宝授权认证 -->
	<dependency>
		<groupId>com.alipay.user.info.auth</groupId>
		<artifactId>user-info-auth</artifactId>
		<version>20161102120103</version>
	</dependency>
	<dependency>
		<groupId>com.aliyun.oss</groupId>
		<artifactId>oss</artifactId>
		<version>2.2.1</version>
	</dependency>
	<dependency>
		<groupId>commons-codec</groupId>
		<artifactId>commons-codec</artifactId>
		<version>1.9</version>
	</dependency>
	<dependency>
		<groupId>commons-logging</groupId>
		<artifactId>commons-logging</artifactId>
		<version>1.2</version>
	</dependency>
	<dependency>
		<groupId>org.hamcrest</groupId>
		<artifactId>hamcrest-core</artifactId>
		<version>1.1</version>
	</dependency>
	<dependency>
		<groupId>org.jdom</groupId>
		<artifactId>jdom</artifactId>
		<version>1.1</version>
	</dependency>
	<dependency>
		<groupId>org.apache.httpcomponents</groupId>
		<artifactId>httpclient</artifactId>
		<version>4.4.1</version>
	</dependency>
	<dependency>
		<groupId>org.apache.httpcomponents</groupId>
		<artifactId>httpcore</artifactId>
		<version>4.4.1</version>
	</dependency>
	<!-- OSS文件上传 end -->

文件上传工具类

package com.asphalt.common.upload;

import java.io.ByteArrayInputStream;
import java.io.File;

import org.slf4j.Logger;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import com.alibaba.druid.util.StringUtils;
import com.aliyun.oss.ClientException;
import com.aliyun.oss.OSSClient;
import com.aliyun.oss.OSSException;
import com.aliyun.oss.model.GetObjectRequest;
import com.asphalt.common.LoggerProxy;

/**
 * 文件上传工具类
 * 
 * @author issuser
 * @date   2016-10-22
 */
@Component
public class FileUploadUtils {
	
	private static Logger logger=LoggerProxy.ProxyLogger(FileUploadUtils.class);
	
/*	private static String ossUrl = PropertiesUtil.GetValueByKey("application.properties", "asphalt.oss_url");
	private static String bucketName = PropertiesUtil.GetValueByKey("application.properties", "asphalt.bucket_name");
	private static String accessKeyId = PropertiesUtil.GetValueByKey("application.properties", "asphalt.access_key_id");
	private static String accessKeySecret = PropertiesUtil.GetValueByKey("application.properties", "asphalt.access_key_secret");*/
		
	@Value("${asphalt.oss_url}")
	private String ossUrl;
	@Value("${asphalt.bucket_name}")
	private String bucketName;
	@Value("${asphalt.access_key_id}")
	private String accessKeyId;
	@Value("${asphalt.access_key_secret}")
	private String accessKeySecret;
	    

	//Constructs a client instance with your account for accessing OSS
	private static OSSClient client = null;
	public OSSClient getInstance()
	{
		if(null == client)
		{
			client = new OSSClient(ossUrl, accessKeyId, accessKeySecret);
		}
		return client;
	}
	
	/**
	 * 文件上传
	 * @param uploadFile
	 * @return
	 */
	public boolean upload(File uploadFile) {
		try {
			if(uploadFile == null){
				return false;
			}
			
			getInstance().putObject(bucketName, uploadFile.getName(), uploadFile);
			logger.info("FileUploadUtils#upload success: bucketName="+bucketName+", filename="+uploadFile.getName());
			return true;
		} catch (OSSException oe) {
			logger.error("OSSException", oe);
		} catch (ClientException ce) {
			logger.error("ClientException", ce);
		} 
		return false;
	}
	
	
	/**
	 * 文件上传
	 * @param parentFolder 要上传的目录
	 * @param filename	   文件名称
	 * @param uploadFile
	 * @return
	 */
	public boolean upload(String parentFolder, String filename, File uploadFile) {
		try {
			if(uploadFile == null || StringUtils.isEmpty(filename)){
				return false;
			}
			
			getInstance().putObject(bucketName, parentFolder + "/" +filename, uploadFile);
			
			logger.info("FileUploadUtils#upload success: bucketName="+bucketName+", parentFolder="+ parentFolder +", filename=" + filename);
			
			return true;
		} catch (OSSException oe) {
			logger.error("OSSException" ,oe);
		} catch (ClientException ce) {
			logger.error("ClientException" ,ce);
		} 
		return false;
	}
	
	/**
	 * 下載文件(oss文件下載)
	 * @param file	下載文件的名字(文件名称或文件路径+名称)
	 * @param path	下載文件的存放地址
	 * @return
	 */
	public boolean download(String filename, String path){
		boolean flag = false;
		try{
			getInstance().getObject(new GetObjectRequest(bucketName, filename), new File(path));
		}catch(Exception e){
			logger.error("FileUploadUtils#downloadFile occur error: filename="+filename+", path="+path, e);
			return flag;
		}
		
		logger.info("FileUploadUtils#downloadFile success: filename="+filename+", path="+path);
		return true;
	}
	
	
	/**
	 * 创建文件夹
	 * @param folderName
	 * @return
	 */
	public boolean createFolder(String folderName){
		
		try {
			if(StringUtils.isEmpty(folderName)){
				return false;
			}
			
			if(!folderName.endsWith("/")){
				folderName = folderName + "/";
			}
			
			//Create an empty folder without request body, note that the key must be suffixed with a slash
			getInstance().putObject(bucketName, folderName, new ByteArrayInputStream(new byte[0]));
			logger.info("FileUploadUtils#createFolder success: folder name is " + folderName);
			
			return true;
		} catch (OSSException oe) {
			logger.error("OSSException" ,oe);
		} catch (ClientException ce) {
			logger.error("ClientException" ,ce);
		} 
		return false;
	}
	
	
	/**
	 * 删除文件
	 * 
	 * @param filename   文件名字(全名-路径+文件名)
	 * @return
	 */
	public boolean deleteFile(String filename){
		
		try {
			if(StringUtils.isEmpty(filename)){
				return false;
			}
			//OSSObject object = client.getObject(bucketName, filename);
			
			//client.deleteObject(bucketName, object.getKey());
			getInstance().deleteObject(bucketName, filename);
			
			return true;
		} catch (OSSException oe) {
			logger.error("OSSException" ,oe);
		} catch (ClientException ce) {
			logger.error("ClientException" ,ce);
		} 
		return false;
	}
	
	
	/**
	 * 删除文件
	 * 
	 * @param filename   文件夹名称
	 * @return
	 */
	public boolean deleteFolder(String foldername){
		
		try {
			if(StringUtils.isEmpty(foldername)){
				return false;
			}
			
			if(!foldername.endsWith("/")){
				foldername = foldername + "/";
			}
			//OSSObject object = client.getObject(bucketName, filename);
			
			//client.deleteObject(bucketName, object.getKey());
			getInstance().deleteObject(bucketName, foldername);
			
			return true;
		} catch (OSSException oe) {
			logger.error("OSSException" ,oe);
		} catch (ClientException ce) {
			logger.error("ClientException" ,ce);
		} 
		return false;
	}

	/**
	 * 打印上
	 * @param uploadId
	 */
	/*private static void listAllParts(String uploadId) {
	    logger.info("Listing all parts......");
	    ListPartsRequest listPartsRequest = new ListPartsRequest(bucketName, fileName, uploadId);
	    PartListing partListing = client.listParts(listPartsRequest);
	    
	    int partCount = partListing.getParts().size();
	    for (int i = 0; i < partCount; i++) {
	        PartSummary partSummary = partListing.getParts().get(i);
	        logger.info("\tPart#" + partSummary.getPartNumber() + ", ETag=" + partSummary.getETag());
	    }
	}*/
}

上传文件封装

package com.asphalt.common.upload;

import java.io.File;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import org.slf4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.util.FileCopyUtils;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;

import com.asphalt.common.LoggerProxy;
import com.asphalt.common.MD5;

/**
 * 上传文件到oss服务器
 * @author as
 *
 */
@Component
public class FileUploadOSSUtil {
	
	private static Logger logger=LoggerProxy.ProxyLogger(FileUploadOSSUtil.class);
	
	@Autowired
	private FileUploadUtils fileUploadUtils;
	
	
/*	private static final String FILE_PATH = PropertiesUtil.GetValueByKey("application.properties", "asphalt.file_path");
	private static final String OSS_URL = PropertiesUtil.GetValueByKey("application.properties", "asphalt.oss_url");//http://oss-cn-hangzhou.aliyuncs.com
	private static final String BUCKET_NAME = PropertiesUtil.GetValueByKey("application.properties", "asphalt.bucket_name");//oss-dev-1
*/	
	//上传到本地服务器的路径
	@Value("${asphalt.file_path}")
	private String FILE_PATH;
	@Value("${asphalt.oss_url}")
	private String OSS_URL;
	@Value("${asphalt.bucket_name}")
	private String BUCKET_NAME;
	
	/**
	 * 上传文件到OSS服务器
	 * @param request
	 * @return Map<String, Object>
	 */
	public Map<String, Object> uploadFileToOSS(HttpServletRequest request ,String fileFieldName) {
		Map<String, Object> map = new HashMap<String, Object>();
		String destPath = null;
		try {
			MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
	        // 获取上传的文件
	        MultipartFile file = multipartRequest.getFile(fileFieldName); 
	        //如果上传的文件不存在
	        if (file.isEmpty()) {
	            map.put("success", false);
	            map.put("msg", "上传文件不存在");
	        } else {
	        	//上传的原始文件名
//	        	String origFileName = new String(file.getOriginalFilename().getBytes("ISO-8859-1"), "UTF-8");
	        	String origFileName = file.getOriginalFilename();
	        	//文件类型
	        	String changeFileName = origFileName.substring(origFileName.lastIndexOf("."), origFileName.length());
	        	//自定义文件名称
	            String fileName = getNowDate() + "-" + System.currentTimeMillis() + changeFileName;
	            //上传到本地服务器的路径
	            File file1 =new File(FILE_PATH);
	            //如果文件夹不存在,则创建    
	            if  (!file1.exists() && !file1.isDirectory()) {       
	                file1.mkdir();    
	            }
	            //上传到本地服务器的文件名称(路径+名称)
	            destPath = FILE_PATH + fileName;
	            //将文件上传到本地服务器路径
            	FileCopyUtils.copy(file.getBytes(), new File(destPath));
            	
		        //文件头编码,判断文件
		        //校验上传文件的类型,根据后缀
		        String fileByFile = changeFileName.substring(1);
		        boolean checkType = CheckFileType.checkType(fileByFile, uploadFileTypeList());
		        if (checkType) {
		        	//上传到OSS服务器的文件夹
		        	String parentFolder = getParentFolder();
		        	//将本地服务器的文件上传
		        	File upFile = new File(destPath);
		        	//上传OSS是否成功
		        	boolean isUploadSuccess = fileUploadUtils.upload(parentFolder, fileName, upFile);
		        	map.put("success", isUploadSuccess);
		        	//如果上传成功,则获取上传文件地址
		        	if(isUploadSuccess) {
		        		String ossFileUrl = getFileOSSUrl(parentFolder ,fileName);
		        		map.put("origFileName", origFileName);
		        		map.put("ossFileUrl", ossFileUrl);
		        		map.put("msg", "文件上传成功");
		        	} else {
		        		map.put("msg", "文件上传文件服务器失败");
		        	}
		        } else {
		        	map.put("sucess", false);
					map.put("msg", "上传文件类型不正确");
		        }
		        //删除本地文件
		        deleteFile(destPath);
	        }
		} catch(Exception e) {
			logger.error("文件上传oss异常",e);
			map.put("success",false);
			map.put("msg","文件上传失败");
			//删除本地文件
			deleteFile(destPath);
        }
        return map;
	}
	
	/**
	 * 上传文件到OSS服务器
	 * @param request
	 * @return Map<String, Object>
	 */
	public Map<String, Object> uploadFileToOSS2(HttpServletRequest request ,String fileFieldName) {
		Map<String, Object> map = new HashMap<String, Object>();
		String destPath = null;
		try {
			MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
	        // 获取上传的文件
	        MultipartFile file = multipartRequest.getFile(fileFieldName); 
	        //如果上传的文件不存在
	        if (file.isEmpty()) {
	            map.put("success", false);
	            map.put("msg", "上传文件不存在");
	        } else {
	        	//上传的原始文件名
//	        	String origFileName = new String(file.getOriginalFilename().getBytes("ISO-8859-1"), "UTF-8");
	        	String origFileName = file.getOriginalFilename();
	        	long fileSize = file.getSize();
	        	//文件类型
	        	String changeFileName = origFileName.substring(origFileName.lastIndexOf("."), origFileName.length());
	        	//自定义文件名称
	            String fileName = getNowDate() + "-" + System.currentTimeMillis() + changeFileName;
	            //上传到本地服务器的路径
	            File file1 =new File(FILE_PATH);
	            //如果文件夹不存在,则创建    
	            if  (!file1 .exists() && !file1 .isDirectory()) {       
	                file1 .mkdir();    
	            }
	            //上传到本地服务器的文件名称(路径+名称)
	            destPath = FILE_PATH + fileName;
	            //将文件上传到本地服务器路径
            	FileCopyUtils.copy(file.getBytes(), new File(destPath));
            	String fileMD5 = MD5.getMD5(new File(destPath));
            	
		        //文件头编码,判断文件,目前只能判断,xls,xlxs,zip,rar
		        //校验上传文件的类型,根据后缀
		        String fileByFile = changeFileName.substring(1);
		        boolean checkType = CheckFileType.checkType(fileByFile, uploadFileTypeList());
		        if (checkType) {
		        	//上传到OSS服务器的文件夹
		        	String parentFolder = getParentFolder();
		        	//将本地服务器的文件上传
		        	File upFile = new File(destPath);
		        	//上传OSS是否成功
		        	boolean isUploadSuccess = fileUploadUtils.upload(parentFolder, fileName, upFile);
		        	map.put("success", isUploadSuccess);
		        	//如果上传成功,则获取上传文件地址
		        	if(isUploadSuccess) {
		        		String ossFileUrl = getFileOSSUrl(parentFolder ,fileName);
		        		map.put("origFileName", origFileName);
		        		map.put("ossFileUrl", ossFileUrl);
		        		map.put("filePath", destPath);
		        		map.put("fileSize", fileSize);
		        		map.put("fileMD5", fileMD5);
		        		map.put("msg", "文件上传成功");
		        	} else {
		        		map.put("msg", "文件上传文件服务器失败");
		        	}
		        } else {
		        	map.put("sucess", false);
					map.put("msg", "上传文件类型不正确");
					//删除本地文件
					deleteFile(destPath);
		        }
	        }
		} catch(Exception e) {
			logger.error("文件上传oss异常",e);
			map.put("success",false);
			map.put("msg","文件上传失败");
			//删除本地文件
			deleteFile(destPath);
        }
        return map;
	}
	
	
	
	/**
	 * 根据规则,获取OSS文件路径
	 * @param parentFolder 父目录
	 * @param fileName 文件名称
	 * @return String
	 */
	public  String getFileOSSUrl(String parentFolder , String fileName) {
		String prefix = "http://";
		String webSlash = "/";
		String genUrl = null;
		if(OSS_URL != null) {
			String domainName = OSS_URL.substring(7);
			genUrl = prefix + BUCKET_NAME + "." + domainName;
		}
		genUrl = (genUrl == null ? OSS_URL : genUrl);
		return genUrl + webSlash + parentFolder + webSlash + fileName;
	}
	
	/**
	 * 当前时间
	 * @return
	 */
	public String getParentFolder() {
		String ossPath = "isoftportalsweb/" + new SimpleDateFormat("yyyyMMdd").format(new Date());
		return ossPath;
	}
	
	/**
	 * 当前时间
	 * @return
	 */
	public static String getNowDate() {
		DateFormat df = new SimpleDateFormat("yyyyMMddHHmmss");
		return df.format(new java.util.Date());
	}
	
	/**
	 * 删除本地服务器文件
	 * @param filePath
	 */
	public static void deleteFile(String filePath) {
		if (new File(filePath).exists()) {
        	new File(filePath).delete();
		}
	}
	
	/**
	 * 允许上传文件类型列表 
	 * @return String[] 上传文件类型列表
	 */
	private static String[] uploadFileTypeList() {
		return new String[] {"JPG", "JPEG", "BMP", "PNG", "GIF" ,"XLS", "XLSX"};
	}
	
}

MD5类

package com.asphalt.common;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class MD5 {
	
	static char hexDigits[]={'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'};
	
	public static String getString(String s) throws Exception{
        char str[];
        byte strTemp[] = null;
		try {
			strTemp = s.getBytes("Utf-8");
		} catch (UnsupportedEncodingException e1) {
			e1.printStackTrace();
		}
         if(strTemp==null) {
        	 throw new Exception("编码出错");
         }
        MessageDigest mdTemp;
        try {
            mdTemp = MessageDigest.getInstance("MD5");
            mdTemp.update(strTemp);
            byte md[]=mdTemp.digest();
            int j=md.length;
            str=new char[j*2];
            int k=0;
            for(int i=0;i<j;i++){
                byte byte0=md[i];
                str[k++]=hexDigits[byte0>>>4&0xf];
                str[k++]=hexDigits[byte0&0xf];
            }
            return new String(str);
        } catch (NoSuchAlgorithmException e) {
            //throw e;
        	return "";
        }
    }
	
    /** 
     * @funcion 对文件全文生成MD5摘要  
     * @param file:要加密的文件 
     * @return MD5摘要码 
     */  
    public static String getMD5(File file) {  
        FileInputStream fis = null;  
        try {  
            MessageDigest md = MessageDigest.getInstance("MD5");  
            fis = new FileInputStream(file);  
            byte[] buffer = new byte[2048];  
            int length = -1;  
            while ((length = fis.read(buffer)) != -1) {  
                md.update(buffer, 0, length);  
            }  
            byte[] b = md.digest();  
            return byteToHexString(b);  
        } catch (Exception e) {  
            e.printStackTrace();  
            return null;  
        } finally {  
            try {  
                fis.close();  
            } catch (IOException e) {  
                e.printStackTrace();  
            }  
        }  
    }   
  
    /** 
     * @function 把byte[]数组转换成十六进制字符串表示形式 
     * @param tmp  要转换的byte[] 
     * @return 十六进制字符串表示形式 
     */  
    private static String byteToHexString(byte[] tmp) {  
        String s;  
        // 用字节表示就是 16 个字节  
        // 每个字节用 16 进制表示的话,使用两个字符,所以表示成 16 进制需要 32 个字符  
        // 比如一个字节为01011011,用十六进制字符来表示就是“5b”  
        char str[] = new char[16 * 2];  
        int k = 0; // 表示转换结果中对应的字符位置  
        for (int i = 0; i < 16; i++) { // 从第一个字节开始,对 MD5 的每一个字节转换成 16 进制字符的转换  
            byte byte0 = tmp[i]; // 取第 i 个字节  
            str[k++] = hexDigits[byte0 >>> 4 & 0xf]; // 取字节中高 4 位的数字转换, >>> 为逻辑右移,将符号位一起右移  
            str[k++] = hexDigits[byte0 & 0xf]; // 取字节中低 4 位的数字转换  
        }  
        s = new String(str); // 换后的结果转换为字符串  
        return s;  
    }  
  
//    public static void main(String arg[]) throws Exception {  
//    	String A = getString("12345asfkfk");
//    	System.out.println(A);
//    	long l1 = System.currentTimeMillis();
//        String a = getMD5(new File("E:/data/内乡/贫困/贫困户信用信息(全).rar"));  
//        long l2 = System.currentTimeMillis();
//        System.out.println(l2-l1);
//        String b = getMD5(new File("e:/2.txt"));  
//        System.out.println("1.txt的摘要值为:" + a);  
//        System.out.println("2.txt的摘要值为:" + b);  
//        if(a.equals(b)) {  
//            System.out.println("a.txt中的内容与b.txt中的内容一致");  
//        } else {  
//            System.out.println("a.txt中的内容与b.txt中的内容不一致");  
//        }  
//    }
    
}

猜你喜欢

转载自blog.csdn.net/qq_22764659/article/details/87969743