阿里云 oss服务器文件上传 java

来源:互联网 发布:mac 涂鸦软件 编辑:程序博客网 时间:2024/05/17 06:04

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

首先准备工作 必要的jar 


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

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

然后是配置文件


现在开通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,之前因为这个找了半天错。

import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.IOException;import java.io.InputStream;import java.util.Date;import org.apache.commons.fileupload.disk.DiskFileItem;import org.springframework.web.multipart.MultipartFile;import org.springframework.web.multipart.commons.CommonsMultipartFile;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.ObjectListing;import com.aliyun.oss.model.ObjectMetadata;import com.aliyun.oss.model.PutObjectResult;/** * 对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 * 返回类型 返回oss存放路径 @throws */public static String uploadFile(MultipartFile multipartFile, String remotePath) throws Exception {// 流转换 将MultipartFile转换为oss所需的InputStreamCommonsMultipartFile cf = (CommonsMultipartFile) multipartFile;DiskFileItem fi = (DiskFileItem) cf.getFileItem();InputStream fileContent = fi.getInputStream();//获取文件名,对文件名做随机处理String fileName = fi.getName();fileName = "lxkc_" + new Date().getTime() + fileName.substring(fileName.lastIndexOf("."));// 加载配置文件,初始化OSSClientOSSConfigure ossConfigure = new OSSConfigure("/system.properties");OSSClient ossClient = new OSSClient(ossConfigure.getEndpoint(), ossConfigure.getAccessKeyId(),ossConfigure.getAccessKeySecret());// 定义二级目录String remoteFilePath = remotePath.substring(0, remotePath.length()).replaceAll("\\\\", "/") + "/";// 创建上传Object的MetadataObjectMetadata 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);// 关闭OSSClientossClient.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 {// 初始化OSSClientOSSClient ossClient = new OSSClient(ossConfigure.getEndpoint(), ossConfigure.getAccessKeyId(),ossConfigure.getAccessKeySecret());OSSObject object = ossClient.getObject(ossConfigure.getBucketName(), key);// 获取ObjectMetaObjectMetadata 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 */public static void deleteFile(OSSConfigure ossConfigure, String filePath) {OSSClient ossClient = new OSSClient(ossConfigure.getEndpoint(), ossConfigure.getAccessKeyId(),ossConfigure.getAccessKeySecret());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)@ResponseBodypublic 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里面有的,因为自己做的过程中出现很多问题,所以分享给大家!

2 0
原创粉丝点击