上传图片到阿里云OSS和获取上传图片的外网url的步骤

<form action= "/bcis/api/headImgUpload.json"  method= "post"  enctype= "multipart/form-data" >
     <input type= "file"  name= "file" >
     <input type= "submit"  value= "提交" >
</form>

2.controller:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@RequestMapping (value =  "/headImgUpload.json" , method = RequestMethod.POST)
  @ResponseBody
  public  Map<String, Object> headImgUpload(HttpServletRequest request,MultipartFile file) {
    Map<String, Object> value =  new  HashMap<String, Object>();
    value.put( "success" true );
    value.put( "errorCode" 0 );
    value.put( "errorMsg" "" );
    try  {
      String head = userService.updateHead(file,  4 ); //此处是调用上传服务接口,4是需要更新的userId 测试数据。
      value.put( "data" , head);
    catch  (IOException e) {
      e.printStackTrace();
      value.put( "success" false );
      value.put( "errorCode" 200 );
      value.put( "errorMsg" "图片上传失败" );
    }
    return  value;
  }

3.service   此处要把

@Autowired
private OSSClientUtil ossClient;注进来
1
2
3
4
5
6
7
8
9
10
@Override
   public  String updateHead(MultipartFile file,  long  userId)  throws  IOException{
     if  (file ==  null  || file.getSize() <=  0 ) {
       throw  new  ImgException( "头像不能为空" );
     }
     String name = ossClient.uploadImg2Oss(file);
     String imgUrl = ossClient.getImgUrl(name);
     userDao.updateHead(userId, imgUrl); //只是本地上传使用的
     return  imgUrl;
   }

4.上传的阿里云的帮助类OSSClientUtil 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
import  java.io.*;
import  java.net.URL;
import  java.util.Date;
import  java.util.Random;
 
import  com.fndsoft.bcis.exception.ImgException;
import  org.apache.commons.logging.Log;
import  org.apache.commons.logging.LogFactory;
 
import  com.aliyun.oss.OSSClient;
import  com.aliyun.oss.model.ObjectMetadata;
import  com.aliyun.oss.model.PutObjectResult;
import  org.springframework.util.StringUtils;
import  org.springframework.web.multipart.MultipartFile;
 
/**
  * 阿里云 OSS文件类
  *
  * @author YuanDuDu
  */
public  class  OSSClientUtil {
 
   Log log = LogFactory.getLog(OSSClientUtil. class );
   // endpoint以杭州为例,其它region请按实际情况填写
   private  String endpoint =  "您的endpoint" ;
   // accessKey
   private  String accessKeyId =  "您的accessKeyId" ;
   private  String accessKeySecret =  "您的accessKeySecret" ;
   //空间
   private  String bucketName =  "bcis" ;
   //文件存储目录
   private  String filedir =  "data/" ;
 
   private  OSSClient ossClient;
 
   public  OSSClientUtil() {
     ossClient =  new  OSSClient(endpoint, accessKeyId, accessKeySecret);
   }
 
   /**
    * 初始化
    */
   public  void  init() {
     ossClient =  new  OSSClient(endpoint, accessKeyId, accessKeySecret);
   }
 
   /**
    * 销毁
    */
   public  void  destory() {
     ossClient.shutdown();
   }
 
   /**
    * 上传图片
    *
    * @param url
    */
   public  void  uploadImg2Oss(String url) {
     File fileOnServer =  new  File(url);
     FileInputStream fin;
     try  {
       fin =  new  FileInputStream(fileOnServer);
       String[] split = url.split( "/" );
       this .uploadFile2OSS(fin, split[split.length -  1 ]);
     catch  (FileNotFoundException e) {
       throw  new  ImgException( "图片上传失败" );
     }
   }
 
 
   public  String uploadImg2Oss(MultipartFile file) {
     if  (file.getSize() >  1024  1024 ) {
       throw  new  ImgException( "上传图片大小不能超过1M!" );
     }
     String originalFilename = file.getOriginalFilename();
     String substring = originalFilename.substring(originalFilename.lastIndexOf( "." )).toLowerCase();
     Random random =  new  Random();
     String name = random.nextInt( 10000 ) + System.currentTimeMillis() + substring;
     try  {
       InputStream inputStream = file.getInputStream();
       this .uploadFile2OSS(inputStream, name);
       return  name;
     catch  (Exception e) {
       throw  new  ImgException( "图片上传失败" );
     }
   }
 
   /**
    * 获得图片路径
    *
    * @param fileUrl
    * @return
    */
   public  String getImgUrl(String fileUrl) {
     if  (!StringUtils.isEmpty(fileUrl)) {
       String[] split = fileUrl.split( "/" );
       return  this .getUrl( this .filedir + split[split.length -  1 ]);
     }
     return  null ;
   }
 
   /**
    * 上传到OSS服务器  如果同名文件会覆盖服务器上的
    *
    * @param instream 文件流
    * @param fileName 文件名称 包括后缀名
    * @return 出错返回"" ,唯一MD5数字签名
    */
   public  String uploadFile2OSS(InputStream instream, String fileName) {
     String ret =  "" ;
     try  {
       //创建上传Object的Metadata 
       ObjectMetadata objectMetadata =  new  ObjectMetadata();
       objectMetadata.setContentLength(instream.available());
       objectMetadata.setCacheControl( "no-cache" );
       objectMetadata.setHeader( "Pragma" "no-cache" );
       objectMetadata.setContentType(getcontentType(fileName.substring(fileName.lastIndexOf( "." ))));
       objectMetadata.setContentDisposition( "inline;filename="  + fileName);
       //上传文件
       PutObjectResult putResult = ossClient.putObject(bucketName, filedir + fileName, instream, objectMetadata);
       ret = putResult.getETag();
     catch  (IOException e) {
       log.error(e.getMessage(), e);
     finally  {
       try  {
         if  (instream !=  null ) {
           instream.close();
         }
       catch  (IOException e) {
         e.printStackTrace();
       }
     }
     return  ret;
   }
 
   /**
    * Description: 判断OSS服务文件上传时文件的contentType
    *
    * @param FilenameExtension 文件后缀
    * @return String
    */
   public  static  String getcontentType(String FilenameExtension) {
     if  (FilenameExtension.equalsIgnoreCase( ".bmp" )) {
       return  "image/bmp" ;
     }
     if  (FilenameExtension.equalsIgnoreCase( ".gif" )) {
       return  "image/gif" ;
     }
     if  (FilenameExtension.equalsIgnoreCase( ".jpeg" ) ||
         FilenameExtension.equalsIgnoreCase( ".jpg" ) ||
         FilenameExtension.equalsIgnoreCase( ".png" )) {
       return  "image/jpeg" ;
     }
     if  (FilenameExtension.equalsIgnoreCase( ".html" )) {
       return  "text/html" ;
     }
     if  (FilenameExtension.equalsIgnoreCase( ".txt" )) {
       return  "text/plain" ;
     }
     if  (FilenameExtension.equalsIgnoreCase( ".vsd" )) {
       return  "application/vnd.visio" ;
     }
     if  (FilenameExtension.equalsIgnoreCase( ".pptx" ) ||
         FilenameExtension.equalsIgnoreCase( ".ppt" )) {
       return  "application/vnd.ms-powerpoint" ;
     }
     if  (FilenameExtension.equalsIgnoreCase( ".docx" ) ||
         FilenameExtension.equalsIgnoreCase( ".doc" )) {
       return  "application/msword" ;
     }
     if  (FilenameExtension.equalsIgnoreCase( ".xml" )) {
       return  "text/xml" ;
     }
     return  "image/jpeg" ;
   }
 
   /**
    * 获得url链接
    *
    * @param key
    * @return
    */
   public  String getUrl(String key) {
     // 设置URL过期时间为10年  3600l* 1000*24*365*10
     Date expiration =  new  Date( new  Date().getTime() + 3600l *  1000  24  365  10 );
     // 生成URL
     URL url = ossClient.generatePresignedUrl(bucketName, key, expiration);
     if  (url !=  null ) {
       return  url.toString();
     }
     return  null ;
   }
}

  

6.需要引入的jar包:gradle配置为:

compile 'com.aliyun.oss:aliyun-sdk-oss:2.2.3'

猜你喜欢

转载自www.cnblogs.com/xiangzideheiniu/p/11984063.html