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

xiaoxiao2021-02-28  109

前天做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里面有的,因为自己做的过程中出现很多问题,所以分享给大家!

转载请注明原文地址: https://www.6miu.com/read-22534.html

最新回复(0)