前天做oss服务器文件上传,之前没了解过,做的过程中遇到许多问题,最终通过查阅相关资料解决了,特分享一下。

首先准备工作 必要的jar 

java阿里oss前端分片上传 阿里oss java_java阿里oss前端分片上传

这里注意版本一致,不然就会报很多坑爹的错误。。

如果你断点调试在执行putObject方法时报错,99%的是jar包有问题。。

然后是配置文件

java阿里oss前端分片上传 阿里oss java_OSS_02

现在开通oss,都是免费开通的,包年9块钱。

这是几个必要的参数,既然做这个肯定 要知道的!这里就不多做解释了。

这里,首先需要我们创建一个OSS信息实体类,OSSConfigure.Java,用来读取配置文件的信息,封装成实体。


import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;  
  /**
   * oss相关参数实体
   * @author liux
   *2017/5/5
   */
public class OSSConfigure {  
  
    private String endpoint;  
    private String accessKeyId;  
    private String accessKeySecret;  
    private String bucketName;  
    private String accessUrl;  
  
    public OSSConfigure() {  
  
    }  
  
    /** 
     * 通过配置文件.properties文件获取,这几项内容。 
     *  
     * @param storageConfName 
     * @throws IOException 
     */  
    public OSSConfigure(String storageConfName) throws IOException {  
  
        Properties prop = new Properties(); 
        InputStream is= super.getClass().getClassLoader().getResourceAsStream(storageConfName);
        prop.load(is);  
  
        endpoint = prop.getProperty("Endpoint").trim();  
        accessKeyId = prop.getProperty("AccessKey").trim();  
        accessKeySecret = prop.getProperty("AccessKeySecret").trim();  
        bucketName = prop.getProperty("BucketName").trim();  
        accessUrl = prop.getProperty("accessUrl").trim();  
  
    }  
  
    public OSSConfigure(String endpoint, String accessKeyId,  
            String accessKeySecret, String bucketName, String accessUrl) {  
  
        this.endpoint = endpoint;  
        this.accessKeyId = accessKeyId;  
        this.accessKeySecret = accessKeySecret;  
        this.bucketName = bucketName;  
        this.accessUrl = accessUrl;  
    }  
  
    public String getEndpoint() {  
        return endpoint;  
    }  
  
    public void setEndpoint(String endpoint) {  
        this.endpoint = endpoint;  
    }  
  
    public String getAccessKeyId() {  
        return accessKeyId;  
    }  
  
    public void setAccessKeyId(String accessKeyId) {  
        this.accessKeyId = accessKeyId;  
    }  
  
    public String getAccessKeySecret() {  
        return accessKeySecret;  
    }  
  
    public void setAccessKeySecret(String accessKeySecret) {  
        this.accessKeySecret = accessKeySecret;  
    }  
  
    public String getBucketName() {  
        return bucketName;  
    }  
  
    public void setBucketName(String bucketName) {  
        this.bucketName = bucketName;  
    }  
  
    public String getAccessUrl() {  
        return accessUrl;  
    }  
  
    public void setAccessUrl(String accessUrl) {  
        this.accessUrl = accessUrl;  
    }  
  
}




然后就是创建一个OSS文件管理的OSSManageUtil工具类。oss文件存储实际上就是对Object的操作,只要写好路径,都会自动创建的,OSSClient是oss的核心,有兴趣的可以多研究下。我做这个 是要上传app,以及压缩图片后上传,contentType这个方法注意,我上传的是apk  所以要用这个类型application/octet-stream,之前因为这个找了半天错。

package com.cdy.utils;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.Date;


import com.aliyun.oss.ClientException;
import com.aliyun.oss.OSSClient;
import com.aliyun.oss.OSSException;
import com.aliyun.oss.model.GetObjectRequest;
import com.aliyun.oss.model.OSSObject;
import com.aliyun.oss.model.ObjectMetadata;

/**
 * 对OSS服务器进行上传删除等的处理
 * 
 * @ClassName: OSSManageUtil
 * @Description:
 * @author liux
 * @date 2017-5-3 上午10:47:00
 * 
 */
public class OSSManageUtil {
	/**
	 * 上传OSS服务器文件 @Title: uploadFile 
	 *  @param multipartFile spring 上传的文件
	 * remotePath @param oss服务器二级目录
	 *  @throws Exception 设定文件 @return String
	 * 返回类型 @throws
	 */
	public static String uploadFile(InputStream fileContent, String remotePath,String fileName) throws Exception {
		//随机名处理
		fileName = "lxkc_" + new Date().getTime() + fileName.substring(fileName.lastIndexOf("."));
		// 加载配置文件,初始化OSSClient
		OSSConfigure ossConfigure = new OSSConfigure("/system.properties");
		OSSClient ossClient = new OSSClient(ossConfigure.getEndpoint(), ossConfigure.getAccessKeyId(),
				ossConfigure.getAccessKeySecret());
		// 定义二级目录
		String remoteFilePath = remotePath.substring(0, remotePath.length()).replaceAll("\\\\", "/") + "/";
		// 创建上传Object的Metadata
		ObjectMetadata objectMetadata = new ObjectMetadata();
		objectMetadata.setContentLength(fileContent.available());
		objectMetadata.setContentEncoding("utf-8");
		objectMetadata.setCacheControl("no-cache");
		objectMetadata.setHeader("Pragma", "no-cache");
		objectMetadata.setContentType(contentType(fileName.substring(fileName.lastIndexOf("."))));
		objectMetadata.setContentDisposition("inline;filename=" + fileName);
		// 上传文件
		ossClient.putObject(ossConfigure.getBucketName(), remoteFilePath + fileName, fileContent, objectMetadata);
		// 关闭OSSClient
		ossClient.shutdown();
		// 关闭io流
		fileContent.close();
		return ossConfigure.getAccessUrl() + "/" + remoteFilePath + fileName;
	}

	// 下载文件
	@SuppressWarnings("unused")
	public static void downloadFile(OSSConfigure ossConfigure, String key, String filename)
			throws OSSException, ClientException, IOException {
		// 初始化OSSClient
		OSSClient ossClient = new OSSClient(ossConfigure.getEndpoint(), ossConfigure.getAccessKeyId(),
				ossConfigure.getAccessKeySecret());
		OSSObject object = ossClient.getObject(ossConfigure.getBucketName(), key);
		// 获取ObjectMeta
		ObjectMetadata meta = object.getObjectMetadata();

		// 获取Object的输入流
		InputStream objectContent = object.getObjectContent();

		ObjectMetadata objectData = ossClient.getObject(new GetObjectRequest(ossConfigure.getBucketName(), key),
				new File(filename));
		// 关闭数据流
		objectContent.close();

	}

	/**
	 * 根据key删除OSS服务器上的文件 @Title: deleteFile @Description: @param @param
	 * ossConfigure @param @param filePath 设定文件 @return void 返回类型 @throws
	 * @throws IOException 
	 */
	public static void deleteFile( String filePath) throws IOException {
		// 加载配置文件,初始化OSSClient
		OSSConfigure ossConfigure = new OSSConfigure("/system.properties");
		OSSClient ossClient = new OSSClient(ossConfigure.getEndpoint(), ossConfigure.getAccessKeyId(),
				ossConfigure.getAccessKeySecret());
		filePath=filePath.substring(45);
		ossClient.deleteObject(ossConfigure.getBucketName(), filePath);

	}

	/**
	 * Description: 判断OSS服务文件上传时文件的contentType @Version1.0
	 * 
	 * @param FilenameExtension
	 *            文件后缀
	 * @return String
	 */
	public static String contentType(String FilenameExtension) {
		if (FilenameExtension.equals(".BMP") || FilenameExtension.equals(".bmp")) {
			return "image/bmp";
		}
		if (FilenameExtension.equals(".GIF") || FilenameExtension.equals(".gif")) {
			return "image/gif";
		}
		if (FilenameExtension.equals(".JPEG") || FilenameExtension.equals(".jpeg") || FilenameExtension.equals(".JPG")
				|| FilenameExtension.equals(".jpg") || FilenameExtension.equals(".PNG")
				|| FilenameExtension.equals(".png")) {
			return "image/jpeg";
		}
		if (FilenameExtension.equals(".HTML") || FilenameExtension.equals(".html")) {
			return "text/html";
		}
		if (FilenameExtension.equals(".TXT") || FilenameExtension.equals(".txt")) {
			return "text/plain";
		}
		if (FilenameExtension.equals(".VSD") || FilenameExtension.equals(".vsd")) {
			return "application/vnd.visio";
		}
		if (FilenameExtension.equals(".PPTX") || FilenameExtension.equals(".pptx") || FilenameExtension.equals(".PPT")
				|| FilenameExtension.equals(".ppt")) {
			return "application/vnd.ms-powerpoint";
		}
		if (FilenameExtension.equals(".DOCX") || FilenameExtension.equals(".docx") || FilenameExtension.equals(".DOC")
				|| FilenameExtension.equals(".doc")) {
			return "application/msword";
		}
		if (FilenameExtension.equals(".XML") || FilenameExtension.equals(".xml")) {
			return "text/xml";
		}
		if (FilenameExtension.equals(".apk") || FilenameExtension.equals(".APK")) {
			return "application/octet-stream";
		}
		return "text/html";
	}
}



以上是主要代码,再贴一下我的controller,我这里是做的app文件上传




/**
	 * app文件上传
	 *
	 * @param imageFile
	 * @param request
	 * @return
	 */
	@RequestMapping(value = "/uploadApp", method = RequestMethod.POST)
	@ResponseBody
	public ImportResponse uploadApp(@RequestParam("app") MultipartFile appFile, VersionUpgrade versionUpgrade) {
		if (versionUpgrade == null) {
			return ImportResponse.fail("上传失败!");
		}
		try {
			 // 流转换 将MultipartFile转换为oss所需的InputStream
 			CommonsMultipartFile cf = (CommonsMultipartFile) appFile;
 			DiskFileItem fi = (DiskFileItem) cf.getFileItem();
 			InputStream fileContent = fi.getInputStream();
 			String fileName = fi.getName();
			String apkUrl = OSSManageUtil.uploadFile( fileContent, "xxapp",fileName);
			versionUpgrade.setApkUrl(apkUrl);
			versionUpgrade.setLoginUserVw(curUser);
			versionUpgradeManager.save(versionUpgrade);
		} catch (Exception e) {
			log.error("【app上传失败】 :", e);
			return ImportResponse.fail("上传失败!");
		}
		return ImportResponse.success("上传成功!");
	}



以上就是全部内容了,都是api里面有的,因为自己做的过程中出现很多问题,所以分享给大家!