这里是修真院后端小课堂,每篇分享文从
【背景介绍】【知识剖析】【常见问题】【解决方案】【编码实战】【扩展思考】【更多讨论】【参考文献】
八个方面深度解析后端知识/技能,本篇分享的是:
【如何调用第三方API实现图片上传。】
大家好,我是IT修真院郑州分院第11期的学员何爽,一枚正直纯洁善良的后端程序员,今天给大家分享一下,修真院官网java(职业)任务5,深度思考中的知识点——如何调用第三方API实现图片上传。
1.背景介绍
在开发过程中,不论是做网页还是APP,基本上都会有图片上传的业务需求,最典型的就是注册账号之后需要用户上传头像或者用户验证的时候上传身份证照片。
而java中实现图片上传大概有两种形式:
一种是使用jsp+controller实现图片上传。
一种是使用jsp+servlet实现图片上传;
存储基本上也有两种形式
在数据库中直接存储blob类型的图片或者图片存储在服务器上并在数据库中存储箱对应的路径。
现在主流的项目开发都是用的后者方式,这时就需要我们使用第三方API
那么什么是API?
API 是用于构建应用程序软件的一组子程序定义,协议和工具。一般来说,这是一套明确定义的各种软件组件之间的通信方法。
2.知识剖析
第三方对外通常会有API和SDK以便我们使用,那么什么是SDK?
SDK (Software Development Kit)中文是"软体开发工具组",用来帮一个 产品、平台开发应用程式的工具组,
由产品的厂商提供给开发者使用的。辅助开发某一类软件的相关文档、范例和工具的集合都可以叫做“SDK”。
任务中使用的阿里云的对象存储OSS,讲一下什么是OSS。
阿里云对象存储服务(Object Storage Service,简称 OSS),是阿里云提供的海量、安全、低成本、高可靠的云存储服务。
可以通过调用 API,在任何应用、任何时间、任何地点上传和下载数据,也可以通过Web控制台对数据进行
简单的管理。OSS适合存放任意类型的文件,适合各种网站、开发企业及开发者使用。
在springmvc中,使用jsp+controller实现图片上传的基本思路是:
(1)使用MultipartFile类接收上传的图片;
(2)将图片存储在服务器(阿里云OSS),返回一个图片路径;
(3)图片路径存储在用户信息中以供调用。
3.常见问题
(1) form表单提交的是MultipartFile类型的文件,而第三方api需要的是file类型的文件,如何进行转换?
(2).如何通过调用阿里云API完成图片的上传
4.解决方案
(1)第一种方法:
MultipartFile file = xxx;
CommonsMultipartFile cf= (CommonsMultipartFile)file;
DiskFileItem fi = (DiskFileItem)cf.getFileItem();
File f = fi.getStoreLocation();
会在项目的根目录的临时文件夹下生成一个文件。
第二种方法:
transferTo(File dest);
会在项目中生成一个新文件;
第三种方法:
File f = (File) xxx 强转即可。前提是要配置multipartResolver,要不然会报类型转换失败的异常。
<bean id="multipartResolver"
<property name="maxUploadSize" value="104857600"/>
<property name="maxInMemorySize" value="4096"/>
</bean>
第四种方法:
Workbook wb = Workbook.getWorkbook(xxx .getInputStream());
转换为输入流,直接读取;
第五种方法:
byte[] buffer = myfile.getBytes();
先转换为字节数组。
(2)详见第四个模块编码实战
5.编码实战
6.扩展思考
集成第三方接口的技巧总结:
调用接口其实也差不多是这样:
发送请求(向第三方发送请求,传递参数)——收到数据(收到第三方的返回数据)——数据处理(数据解析)——返回前端——前端处理(前端展示封装数据)。
1)api文档阅读:主要看请求参数和返回数据,有些文档有很多demo,这些demo会帮助我们很多。
参考这个内容:http://www.pmcaff.com/discuss...
2)json数据解析:net.fs.json还是阿里的fastjson还是jacksondegnd
具体参考:https://www.cnblogs.com/huoer...
3)调用第三方使用的工具:Httpclient、urlConnection还是RestTemplate
具体内容参考:http://blog.csdn.net/lmb55/ar...
7.参考文献
https://www.cnblogs.com/fengl...
https://blog.csdn.net/qq_4180...
https://blog.csdn.net/qq_4181...
8.更多讨论
Q1:提问人:张亚强:
腾讯cos和阿里oss第三方对象存储有什么异同?
A1:回答人(何爽):
就个人理解其两者并没有什么大的不同,个人理解两者都是一个远程内存罢了,oss可以自我添加水印,缩略图,防盗链等,但cos却不可以自我添加,需要引入第三方jar包实现。
Q2:提问人:张亚强
上传图片时是否可以通过字符流进行上传?
A2:回答人(何爽):
不能,因为图片是二进制编码。
Q3:提问人:周宏浩
拦截器怎么拦截图片?
A3:回答人(何爽):
在from里面加入了enctype="multipart/form-data" 就可以了。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。