阿里云 oss服务器文件上传 java
前天做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,之前因为这个找了半天错。
- 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里面有的,因为自己做的过程中出现很多问题,所以分享给大家!