这里是修真院后端小课堂,每篇分享文从
【背景介绍】【知识剖析】【常见问题】【解决方案】【编码实战】【扩展思考】【更多讨论】【参考文献】
八个方面深度解析后端知识/技能,本篇分享的是:
【图片上传。】
大家好,我是IT修真院郑州分院第十期学员,一枚正直纯洁善良的JAVA程序员。
今天给大家分享一下,java任务扩展思考知识点——图片上传。
一、背景介绍
在开发过程中,不论是做网页还是APP,基本上都会有图片上传的业务需求,最典型的就是注册账号之后需要用户上传头像或者用户验证的时候上传身份证照片。 而java中实现图片上传大概有两种形式:一种是使用jsp+servlet实现图片上传;一种是使用jsp+controller实现图片上传。 存储基本上也有两种形式,在数据库中直接存储blob类型的图片或者图片存储在服务器上并在数据库中存储箱对应的路径,绝大部分网站用后者。采用后者时我们就要学习使用第三方的API。
API(Application Programming Interface,应用程序编程接口)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。(百度百科)
其实调用使用第三方API,主要就是导入jar包,学习第三方文档中方法,了解各个方法的入参、返回值,通过判断返回值确定调用第三方的操作是否成功。
二、知识剖析
如何通过腾讯cos完成图片的上传
1.接收前端页面传来的MultipartFile类型文件,获得文件流,调用cosClient.putObject(bucketName, key, fileInputStream, objectMetadata)方法进行上传;
2.接收前端页面传来的MultipartFile类型文件,将文件转存在服务器的某个位置,调用cosClient.putObject(bucketName, key, localFile)方法进行上传。
如何通过腾讯cos完成前端页面图片的显示?
1.调用getObjectContent()方法获取输入流,与HttpServletResponse的输出流对接在前端页面利用img标签发送请求显示;
2.调用generatePresignedUrl(bucketName, key,expiration)方法获得签名的url路径,前端页面利用img标签显示;
3.调用getObject(getObjectRequest, downFile)方法将图片下载到本地,再有本地转存前端img标签显示。
三、常见问题
上传图片时如何完成图片的回显?(详见代码实战)
1.filereader 的方法;
2.createObjectURL的方法。
四、编码实战
详见视频。
五、扩展思考
1.可不可以通过字符流进行图片、视频等文件的传输?
不能,计算机中的所有信息都是以二进制形式进行的存储(1010)图片中的也都是,字符流读取二进制文件的时候自动对这些二进制按照码表进行了编码处理,但是图片本来就是二进制文件,不需要进行编码。有一些巧合在码表中有对应,就可以处理,并不是所有的二进制都可以找到对应的。信息就会丢失。
2.如何对上传的图片进行压缩、添加水印?
利用Thumbnailator jar包,Thumbnailator是一个用java生成高质量缩略图的第三方库,可以用来生成缩率图、添加水印、图片旋转、图片大小缩放和.图片压缩等。
六、参考文献
https://cloud.tencent.com/doc...
https://blog.csdn.net/hanchao...
https://blog.csdn.net/lcj_sta...
https://blog.csdn.net/weixin_...
https://blog.csdn.net/hanchao...
七、更多讨论
1.腾讯cos如何设置防盗链?
为了避免恶意程序使用资源 URL 盗刷公网流量或使用恶意手法盗用资源,给用户带来不必要的损失。腾讯云对象存储支持防盗链配置通过控制台的防盗链设置配置黑/白名单,来进行安全防护。
详见链接:https://cloud.tencent.com/doc...
2.如何处理文件名是中文?
(1)对于中文,一般我们会在web.xml最前面配置如下所示过滤器;
<!-- 配置过滤器, 设置编码为UTF-8 --><filter><filter-name>CharacterFilter</filter-name><filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> </filter>
(2)如何还有个别中文乱码,我们可以针对某个字符串做如下处理转换编码格式为中文;
URLEncoder.encode("相关字符串","utf-8");
3.表单图片上传怎么做?
1) 表单的提交方式 :"method=post"
2) 表单的类型 :enctype="multipart/form-data"
3) 上传表单的文件项:<input type="file" name="xx" /> //其中名字是必须要的
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。