阿里云oss服务器文件上传javahttp://www.bieryun.com/1251.html
前天做OSS服务器文件上传,之前没了解过,做的过程中遇到许多问题,最终通过查阅相关资料解决了,特分享一下。
首先准备工作必要的jar
这里注意版本一致,不然就会报很多坑爹的错误..
如果你断点调试在执行putObject方法时报错,99%的是罐子包有问题..
然后是配置文件
现在开通OSS,都是免费开通的,包年9块钱。
这是几个必要的参数,既然做这个肯定要知道的!这里就不多做解释了。
这里,首先需要我们创建一个OSS 信息实体类,OSSCon 图。Java,用来读取配置文件的信息,封装成实体。
- import java.io.IOException;
- import java.io.InputStream;
- import java.util.Properties;
- / **
- * oss相关参数实体
- * @author liux
- * 2017年/ 5/5
- * /
- 公共类 OSSConfigure {
- 私人 字符串端点;
- 私人 字符串accessKeyId;
- 私人 字符串accessKeySecret;
- 私人 字符串bucketName;
- 私人 字符串accessUrl;
- public OSSConfigure(){
- }
- / **
- *通过配置文件.properties文件获取,这几项内容。
- *
- * @param storageConfName
- * @抛出IOException
- * /
- 公共 OSSConfigure(字符串storageConfName) 抛出 IOException {
- 属性prop = new Properties();
- InputStream is = super .getClass()。getClassLoader()。getResourceAsStream(storageConfName);
- prop.load(是);
- 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();
- }
- 公共 OSSConfigure(字符串端点,字符串accessKeyId,
- 字符串accessKeySecret,字符串bucketName,字符串accessUrl){
- 这个.endpoint =端点;
- 这个.accessKeyId = accessKeyId;
- 这个.accessKeySecret = accessKeySecret;
- 这个.bucketName = bucketName;
- 这个.accessUrl = accessUrl;
- }
- public String getEndpoint(){
- 返回 终点;
- }
- public void setEndpoint(String endpoint){
- 这个.endpoint =端点;
- }
- public String getAccessKeyId(){
- 返回 accessKeyId;
- }
- public void setAccessKeyId(String accessKeyId){
- 这个.accessKeyId = accessKeyId;
- }
- public String getAccessKeySecret(){
- 返回 accessKeySecret;
- }
- public void setAccessKeySecret(String accessKeySecret){
- 这个.accessKeySecret = accessKeySecret;
- }
- public String getBucketName(){
- 返回 bucketName;
- }
- public void setBucketName(String bucketName){
- 这个.bucketName = bucketName;
- }
- public String getAccessUrl(){
- 返回 accessUrl;
- }
- public void setAccessUrl(String accessUrl){
- 这个.accessUrl = accessUrl;
- }
- }
然后就是创建一个OSS文件管理的OSSManageUtil工具类的.oss文件存储实际上就是对对象的操作,只要写好路径,都会自动创建的,OSSClient是OSS的核心,有兴趣的可以多研究下。我做这个是要上传app,以及压缩图片后上传,contentType这个方法注意,我上传的是所以要用这个类型application / octet-stream,之前因为这个找了半天错。
- 包 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
- * @说明:
- * @author liux
- * @date 2017-5-3上午10:47:00
- *
- * /
- 公共类 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 = 新的 OSSClient(ossConfigure.getEndpoint(),ossConfigure.getAccessKeyId(),
- ossConfigure.getAccessKeySecret());
- //定义二级目录
- String remoteFilePath = remotePath.substring(0 ,remotePath.length())。replaceAll(“\\\\”,“ / ”)+“ /”;
- //创建上传对象的元数据
- 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 (“未使用” )
- public static void downloadFile(OSSConfigure ossConfigure,String key,String filename)
- 抛出 OSSException,ClientException,IOException {
- //初始化OSSClient
- OSSClient ossClient = 新的 OSSClient(ossConfigure.getEndpoint(),ossConfigure.getAccessKeyId(),
- ossConfigure.getAccessKeySecret());
- OSSObject对象= ossClient.getObject(ossConfigure.getBucketName(),key);
- //获取ObjectMeta
- ObjectMetadata meta = object.getObjectMetadata();
- //获取对象的输入流
- InputStream objectContent = object.getObjectContent();
- ObjectMetadata objectData = ossClient.getObject(new GetObjectRequest(ossConfigure.getBucketName(),key),
- 新 文件(文件名));
- //关闭数据流
- objectContent.close();
- }
- / **
- *根据key删除OSS服务器上的文件@Title:deleteFile @Description:@param @param
- * ossConfigure @param @param filePath设定文件@return void返回类型@throws
- * @抛出IOException
- * /
- public static void deleteFile(String filePath) throws IOException {
- //加载配置文件,初始化OSSClient
- OSSConfigure ossConfigure = new OSSConfigure(“/ system.properties ” );
- OSSClient ossClient = 新的 OSSClient(ossConfigure.getEndpoint(),ossConfigure.getAccessKeyId(),
- ossConfigure.getAccessKeySecret());
- filePath = filePath.substring(45 );
- ossClient.deleteObject(ossConfigure.getBucketName(),filePath);
- }
- / **
- *描述:判断OSS服务文件上传时文件的contentType @ Version1.0
- *
- * @param FilenameExtension
- *文件后缀
- * @返回字符串
- * /
- public static String contentType(String FileNameExtension){
- if (FilenameExtension.equals(“.BMP” )|| FilenameExtension.equals(“.bmp” )){
- 返回“image / bmp” ;
- }
- if (FilenameExtension.equals(“.GIF” )|| FilenameExtension.equals(“.gif” )){
- 返回“image / gif” ;
- }
- if (FilenameExtension.equals(“.JPEG” )|| FilenameExtension.equals(“.jpeg” )|| FilenameExtension.equals(“.JPG” )
- || FilenameExtension.equals(“.jpg” )|| FilenameExtension.equals(“.PNG” )
- || FilenameExtension.equals(“.png” )){
- 返回“image / jpeg” ;
- }
- if (FilenameExtension.equals(“. HTML” )|| FilenameExtension.equals(“.html” )){
- 返回“text / html” ;
- }
- if (FilenameExtension.equals(“.TXT” )|| FilenameExtension.equals(“.txt” )){
- 返回“text / plain” ;
- }
- if (FilenameExtension.equals(“.VSD” )|| FilenameExtension.equals(“.vsd ” )){
- 返回“application / vnd.visio” ;
- }
- if (FilenameExtension.equals(“.PPTX” )|| FilenameExtension.equals(“.pptx” )|| FilenameExtension.equals(“.PPT” )
- || FilenameExtension.equals(“.ppt” )){
- 返回“application / vnd.ms-powerpoint” ;
- }
- if (FilenameExtension.equals(“.DOCX” )|| FilenameExtension.equals(“.docx” )|| FilenameExtension.equals(“.DOC” )
- || FilenameExtension.equals(“.doc” )){
- 返回“application / msword” ;
- }
- if (FilenameExtension.equals(“.XML” )|| FilenameExtension.equals(“.xml” )){
- 返回“text / xml” ;
- }
- if (FilenameExtension.equals(“. apk” )|| FilenameExtension.equals(“.APK” )){
- 返回“application / octet-stream” ;
- }
- 返回“text / html” ;
- }
- }
以上是主要代码,再贴一下我的控制器,我这里是做的应用程序文件上传
- / **
- * app文件上传
- *
- * @param imageFile
- * @param请求
- * @返回
- * /
- @RequestMapping (value = “/ uploadApp” ,method = RequestMethod.POST)
- @ResponseBody
- public ImportResponse uploadApp(@RequestParam (“app” )MultipartFile appFile,VersionUpgrade versionUpgrade){
- if (versionUpgrade == null ){
- 返回 ImportResponse.fail(“上传失败!” );
- }
- 尝试 {
- //流转换将MultipartFile转换为所需的InputStream
- CommonsMultipartFile cf =(CommonsMultipartFile)appFile;
- DiskFileItem fi =(DiskFileItem)cf.getFileItem();
- InputStream fileContent = fi.getInputStream();
- String fileName = fi.getName();
- 字符串apkUrl = OSSManageUtil.uploadFile(fileContent, “xxapp” ,fileName);
- versionUpgrade.setApkUrl(apkUrl);
- versionUpgrade.setLoginUserVw(curUser);
- versionUpgradeManager.save(versionUpgrade);
- } 捕获 (例外五){
- log.error(“【app上传失败】:” ,e);
- 返回 ImportResponse.fail(“上传失败!” );
- }
- 返回 ImportResponse.success(“上传成功!” );
- }
以上就是全部内容了,都是API里面有的,因为自己做的过程中出现很多问题,所以分享给大家!
- <p> <span lang = “zh-CN” style = “font-size:18.6667px; font-family:新宋体” > </ span> </ p>