上傳圖片到阿里雲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'


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM