上传图片到阿里云OSS和获取上传图片的外网url的步骤
啥都不说 直接上代码
1.html:
1 2 3 4 | <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'
分类:
java
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
2015-06-17 $q服务的API详解