Java项目集成阿里云OSS上传图片

工具类:

import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.aliyun.oss.OSSClient;
import com.aliyun.oss.model.Bucket;
import com.aliyun.oss.model.CannedAccessControlList;
import com.aliyun.oss.model.OSSObject;
import com.aliyun.oss.model.ObjectMetadata;
import com.aliyun.oss.model.PutObjectResult;
import com.shineyoo.manager.util.common.utils.IdGen;
import com.shineyoo.manager.util.common.utils.PropertiesLoader;

/**

  • @class:AliyunOSSClientUtil
  • @descript:java使用阿里云OSS存储对象上传图片

*/
public class AliyunOSSClientUtil {
//log日志
private static Logger logger = LoggerFactory.getLogger(AliyunOSSClientUtil.class);

private static PropertiesLoader loader = new PropertiesLoader("aliyunoss.properties");
//阿里云API的内或外网域名  
private static String ENDPOINT;  
//阿里云API的密钥Access Key ID  
private static String ACCESS_KEY_ID;  
//阿里云API的密钥Access Key Secret  
private static String ACCESS_KEY_SECRET;  
//阿里云API的bucket名称  
private static String BACKET_NAME;  
//阿里云API的文件夹名称  
private static String FOLDER;

//初始化属性  
static{  
    ENDPOINT = loader.getProperty("ENDPOINT");
    ACCESS_KEY_ID = loader.getProperty("ACCESS_KEY_ID");
    ACCESS_KEY_SECRET = loader.getProperty("ACCESS_KEY_SECRET");
    BACKET_NAME = loader.getProperty("BACKET_NAME");
    FOLDER = loader.getProperty("FOLDER");
}
/**
* 获取配置
* @see
*/

public static String getConfig(String key) {
String value = loader.getProperty(key);
return value;
}

/** 
 * 获取阿里云OSS客户端对象 
 * @return ossClient 
 */  
public static  OSSClient getOSSClient(){  
    return new OSSClient(ENDPOINT,ACCESS_KEY_ID, ACCESS_KEY_SECRET);  
}  

/** 
 * 创建存储空间 
 * @param ossClient      OSS连接 
 * @param bucketName 存储空间 
 * @return 
 */  
public  static String createBucketName(OSSClient ossClient,String bucketName){  
    //存储空间  
    final String bucketNames=bucketName;  
    if(!ossClient.doesBucketExist(bucketName)){  
        //创建存储空间  
        Bucket bucket=ossClient.createBucket(bucketName);  
        logger.info("创建存储空间成功");  
        return bucket.getName();  
    }  
    return bucketNames;  
}  

/** 
 * 创建存储空间 
 * @param ossClient      OSS连接 
 * @param bucketName 存储空间 
 * @return 
 */  
public  static void putBucketACL(OSSClient ossClient,String bucketName){  
    //存储空间  
    final String bucketNames=bucketName;  
    System.out.println(ossClient.doesBucketExist(bucketName));
    if(ossClient.doesBucketExist(bucketName)){  
        //修改存储空间的权限
        ossClient.setBucketAcl(bucketNames, CannedAccessControlList.PublicRead);
        logger.info("创建存储空间成功");  
    }  
}  
  
/** 
 * 删除存储空间buckName 
 * @param ossClient  oss对象 
 * @param bucketName  存储空间 
 */  
public static  void deleteBucket(OSSClient ossClient, String bucketName){    
    ossClient.deleteBucket(bucketName);     
    logger.info("删除" + bucketName + "Bucket成功");    
}    
  
/** 
 * 创建模拟文件夹 
 * @param ossClient oss连接 
 * @param bucketName 存储空间 
 * @param folder   模拟文件夹名如"qj_nanjing/" 
 * @return  文件夹名 
 */  
public  static String createFolder(OSSClient ossClient,String bucketName,String folder){  
    //文件夹名   
    final String keySuffixWithSlash =folder;  
    //判断文件夹是否存在,不存在则创建  
    if(!ossClient.doesObjectExist(bucketName, keySuffixWithSlash)){  
        //创建文件夹  
        ossClient.putObject(bucketName, keySuffixWithSlash, new ByteArrayInputStream(new byte[0]));  
        logger.info("创建文件夹成功");  
        //得到文件夹名  
        OSSObject object = ossClient.getObject(bucketName, keySuffixWithSlash);  
        String fileDir=object.getKey();  
        return fileDir;  
    }  
    return keySuffixWithSlash;  
}  
  
 /**   
    * 根据key删除OSS服务器上的文件   
    * @param ossClient  oss连接 
    * @param bucketName  存储空间  
    * @param folder  模拟文件夹名 如"qj_nanjing/" 
    * @param key Bucket下的文件的路径名+文件名 如:"upload/cake.jpg" 
    */      
   public static void deleteFile(OSSClient ossClient, String bucketName, String folder, String key){      
        ossClient.deleteObject(bucketName, folder + key);     
        logger.info("删除" + bucketName + "下的文件" + folder + key + "成功");    
   }   
   /**   
    * 根据key删除OSS服务器上的文件   
    * @param key Bucket下的文件的路径名+文件名 如:"upload/cake.jpg"
    */      
   public static void deleteFile(String key){
      OSSClient ossClient = getOSSClient();
      ossClient.deleteObject(BACKET_NAME,key);     
      logger.info("删除" + BACKET_NAME + "下的文件" + key + "成功");    
   } 
  
/** 
 * 上传图片至OSS 
 * @param file 上传文件(文件全路径如:D:\\image\\cake.jpg) 
 * @return String 返回访问路径
 * */  
public static  String uploadObject2OSS(File file) {  
   OSSClient ossClient = getOSSClient();
    String resultStr = null;  
    String fileName = null;
    try {  
        //以输入流的形式上传文件  
        InputStream is = new FileInputStream(file);  
        //文件名  如果出现重复,则重新生成名字,再上传
        fileName = getfileName(file.getName());   
        if(ossClient.doesObjectExist(BACKET_NAME, FOLDER + fileName)){
           fileName = getfileName(file.getName());   
        }
        //文件大小  
        Long fileSize = file.length();   
        //创建上传Object的Metadata    
        ObjectMetadata metadata = new ObjectMetadata();  
        //上传的文件的长度  
        metadata.setContentLength(is.available());    
        //指定该Object被下载时的网页的缓存行为  
        metadata.setCacheControl("no-cache");   
        //指定该Object下设置Header  
        metadata.setHeader("Pragma", "no-cache");    
        //指定该Object被下载时的内容编码格式  
        metadata.setContentEncoding("utf-8");    
        //文件的MIME,定义文件的类型及网页编码,决定浏览器将以什么形式、什么编码读取文件。如果用户没有指定则根据Key或文件名的扩展名生成,  
        //如果没有扩展名则填默认值application/octet-stream  
        metadata.setContentType(getContentType(fileName));    
        //指定该Object被下载时的名称(指示MINME用户代理如何显示附加的文件,打开或下载,及文件名称)  
        metadata.setContentDisposition("filename/filesize=" + fileName + "/" + fileSize + "Byte.");    
        //上传文件   (上传文件流的形式)  
       PutObjectResult putResult = ossClient.putObject(BACKET_NAME, FOLDER + fileName, is, metadata);    
       resultStr = putResult.getETag();  
       logger.info("上传阿里云OSS服务器成功." +resultStr);    
        //解析结果  
    } catch (Exception e) {  
        e.printStackTrace();  
         logger.error("上传阿里云OSS服务器异常." + e.getMessage(), e);    
    }  
    return "http://"+BACKET_NAME+"."+ENDPOINT+"/"+FOLDER + fileName;  
}  
/** 
 * 上传图片至OSS 
 * @param in 上传文件流
 * @return String 返回访问路径,图片存储KEY
 * */  
public static  String uploadObject2OSS(InputStream in,String name,Long size) {  
   OSSClient ossClient = getOSSClient();
   String resultStr = null;  
   String fileName = null;
   try {  
      //文件名  如果出现重复,则重新生成名字,再上传
      fileName = getfileName(name);   
      if(ossClient.doesObjectExist(BACKET_NAME, FOLDER + fileName)){
         fileName = getfileName(name);   
      }
      //文件大小  
      Long fileSize = size;   
      //创建上传Object的Metadata    
      ObjectMetadata metadata = new ObjectMetadata();  
      //上传的文件的长度  
      metadata.setContentLength(in.available());    
      //指定该Object被下载时的网页的缓存行为  
      metadata.setCacheControl("no-cache");   
      //指定该Object下设置Header  
      metadata.setHeader("Pragma", "no-cache");    
      //指定该Object被下载时的内容编码格式  
      metadata.setContentEncoding("utf-8");    
      //文件的MIME,定义文件的类型及网页编码,决定浏览器将以什么形式、什么编码读取文件。如果用户没有指定则根据Key或文件名的扩展名生成,  
      //如果没有扩展名则填默认值application/octet-stream  
      metadata.setContentType(getContentType(fileName));    
      //指定该Object被下载时的名称(指示MINME用户代理如何显示附加的文件,打开或下载,及文件名称)  
      metadata.setContentDisposition("filename/filesize=" + fileName + "/" + fileSize + "Byte.");    
      //上传文件   (上传文件流的形式)  
      PutObjectResult putResult = ossClient.putObject(BACKET_NAME, FOLDER + fileName, in, metadata);    
      resultStr = putResult.getETag();  
      logger.info("上传阿里云OSS服务器成功." +resultStr);    
      //解析结果  
   } catch (Exception e) {  
      e.printStackTrace();  
      logger.error("上传阿里云OSS服务器异常." + e.getMessage(), e);    
   }
   return BACKET_NAME+"."+ENDPOINT+"/"+FOLDER + fileName;  
}  

/** 
 * 通过文件名判断并获取OSS服务文件上传时文件的contentType 
 * @param fileName 文件名 
 * @return 文件的contentType 
 */  
public static  String getContentType(String fileName){  
    //文件的后缀名  
    String fileExtension = fileName.substring(fileName.lastIndexOf("."));  
    if(".bmp".equalsIgnoreCase(fileExtension)) {  
        return "image/bmp";  
    }  
    if(".gif".equalsIgnoreCase(fileExtension)) {  
        return "image/gif";  
    }  
    if(".jpeg".equalsIgnoreCase(fileExtension) || ".jpg".equalsIgnoreCase(fileExtension)  || ".png".equalsIgnoreCase(fileExtension) ) {  
        return "image/jpeg";  
    }  
    if(".html".equalsIgnoreCase(fileExtension)) {  
        return "text/html";  
    }  
    if(".txt".equalsIgnoreCase(fileExtension)) {  
        return "text/plain";  
    }  
    if(".vsd".equalsIgnoreCase(fileExtension)) {  
        return "application/vnd.visio";  
    }  
    if(".ppt".equalsIgnoreCase(fileExtension) || "pptx".equalsIgnoreCase(fileExtension)) {  
        return "application/vnd.ms-powerpoint";  
    }  
    if(".doc".equalsIgnoreCase(fileExtension) || "docx".equalsIgnoreCase(fileExtension)) {  
        return "application/msword";  
    }  
    if(".xml".equalsIgnoreCase(fileExtension)) {  
        return "text/xml";  
    }  
    //默认返回类型  
    return "image/jpeg";  
}  

/** 
 * 修改文件名
 * @param fileName 文件名 
 * @return 文件的新名称 
 */  
public static  String getfileName(String fileName){  
   String fileType = fileName.substring(fileName.lastIndexOf("."), fileName.length());
   String name = IdGen.uuid()+fileType;
   System.out.println(fileName+"----"+name);
   return name;
   
}

  
//测试  
public static void main(String[] args) throws Exception {  
   /* //上传文件  
    String f="D:\\tu\\21107201_230758751000-2.jpg";  
    File file=new File(f);  
    try{
       String md5key = AliyunOSSClientUtil.uploadObject2OSS(file);    
       System.out.println("上传后的文件MD5数字唯一签名:" + md5key);    
    }catch(Exception e){
       e.printStackTrace();
    }*/
   
   
    //初始化OSSClient  
    OSSClient ossClient=AliyunOSSClientUtil.getOSSClient();  
    //上传文件  
    String files="D:\\tu\\w1.png,D:\\tu\\w2.png,D:\\tu\\w3.png,D:\\tu\\w4.png,D:\\tu\\w5.png";  
    String[] file=files.split(",");  
    for(String filename:file){  
        //System.out.println("filename:"+filename);  
        File filess=new File(filename);  
        String md5key = AliyunOSSClientUtil.uploadObject2OSS(filess);    
        System.out.println("文件地址:" + md5key);    
          
    }  
}  

}

业务层调用:

//获取文件
MultipartFile single = productProduct.getSingle();
String name = single.getOriginalFilename();//文件名字
String key;
try {
key = AliyunOSSClientUtil.uploadObject2OSS(single.getInputStream(),name,single.getSize());
productProduct.setAvatarUrl(key);//这里存的是阿里云上的文件路径
} catch (IOException e) {
e.printStackTrace();
}

pxm引入jar

com.aliyun.oss aliyun-sdk-oss 2.7.0

注意表单提交时form加属性:enctype=“multipart/form-data”

html页面:

上传文件:

照片提交回显:

$(function () {
$("#file_upload").change(function () {
var $file = $(this);
var fileObj = $file[0];
var windowURL = window.URL || window.webkitURL;
var dataURL;
var $img = $("#preview");

    if (fileObj && fileObj.files && fileObj.files[0]) {
        dataURL = windowURL.createObjectURL(fileObj.files[0]);
        //alert($("#file_upload").val().files[0]);
        //$("#single").val(fileObj.files[0]);
        $img.attr('src', dataURL);
    } else {
        dataURL = $file.val();
        var imgObj = document.getElementById("preview");
        imgObj.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod=scale)";
        imgObj.filters.item("DXImageTransform.Microsoft.AlphaImageLoader").src = dataURL;

    }
});

});

ajax方式上传:

    var mydata = document.getElementById("file_upload").files[0];
    formData = new FormData();
    formData.append("file", mydata);
    $.ajax({
        contentType:"multipart/form-data",
        url:prefix + "/add",
        type:"POST",
        data:formData,
        dataType:"text",
        processData: false, // 告诉jQuery不要去处理发送的数据
        contentType: false, // 告诉jQuery不要去设置Content-Type请求头
        success: function(result){
            alert(result);
        }
    });

猜你喜欢

转载自blog.csdn.net/qq_27319683/article/details/84342380