• JavaWeb开发——文件上传


    1 简介

    文件上传:将本地图片、视频、音频等文件上传到服务器,供其他用户浏览或下载的过程

    文件上传涉及到两部分:前端程序 + 服务端程序

    前端程序

    【三要素】:① 需要定义一个form 表单,且表单里需定义一个类型为“ file ” 的表单项;② 表单的提交方式必须为post 方式;③ 需要通过 enctype 属性来指定表单的编码格式为“ multipart/form-data”,因为普通默认的编码格式不适合传输大型的二进制数据

    服务端接收文件

    通过Spring提供的 API:MultipartFile 接收上传的文件,上传上来的文件是一个临时的文件,当我们文件上传这次请求响应完毕之后,该临时文件会自动删除

    【注】get 是获取信息(获取),post 是负责传输信息(提交);get 在 url 后拼接,post 在数据体中发送

     MultipartFile 常用方法:

    2 本地存储

    本地存储:在服务端接收到上传上来的文件之后,将文件存储到本地服务器磁盘中

    【执行过程】通过 MultipartFile 所有的 image 信息都已经获取到,利用 image.getOriginalFilename(),就可以获取到文件的原始名,然后保存为本地磁盘中的文件名

    存在问题: A用户和B用户上传同名文件,则会导致数据被覆盖

    代码优化  

    【注】实际项目开发过程中,本地存储的方式较为少用,原因:① 前端页面没法直接访问这些存储在本地磁盘的文件;② 磁盘容量有限;③ 磁盘损坏,则数据全部丢失

    3 阿里云OSS

    3.1 准备

    阿里云对象存储(Object Storage Service):可通过网络随时存储和调用包括文本、图片、音频和视频等在内的各种文件

    使用第三方服务器的通用思路:

    Bucket:存储空间,是用户用于存储对象(Object,就是文件)的容器,所有的对象必须隶属于某个存储空间

    AccessKey:包含AccessKey ID以及AccessKey Secret

    SDK:Software Development Kit 的缩写,软件开发工具包,包括辅助软件开发的依赖(jar 包)、代码示例等,都可以叫做SDK

    3.2 入门

    官方文档链接(也可以登录自己账号以后在后台查看SDK) :

    对象存储 OSS-阿里云帮助中心 (aliyun.com)

    1. import com.aliyun.oss.ClientException;
    2. import com.aliyun.oss.OSS;
    3. import com.aliyun.oss.OSSClientBuilder;
    4. import com.aliyun.oss.OSSException;
    5. import com.aliyun.oss.common.auth.CredentialsProviderFactory;
    6. import com.aliyun.oss.common.auth.EnvironmentVariableCredentialsProvider;
    7. import java.io.ByteArrayInputStream;
    8. public class Demo {
    9. public static void main(String[] args) throws Exception {
    10. // Endpoint以华东1(杭州)为例,其它Region请按实际情况填写。
    11. String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
    12. // 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
    13. EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
    14. // 填写Bucket名称,例如examplebucket。
    15. String bucketName = "examplebucket";
    16. // 填写Object完整路径,例如exampledir/exampleobject.txt。Object完整路径中不能包含Bucket名称。
    17. String objectName = "exampledir/exampleobject.txt";
    18. // 创建OSSClient实例。
    19. OSS ossClient = new OSSClientBuilder().build(endpoint, credentialsProvider);
    20. try {
    21. String content = "Hello OSS";
    22. //创建PutObject请求
    23. ossClient.putObject(bucketName, objectName, new ByteArrayInputStream(content.getBytes()));
    24. } catch (OSSException oe) {
    25. System.out.println("Caught an OSSException, which means your request made it to OSS, "
    26. + "but was rejected with an error response for some reason.");
    27. System.out.println("Error Message:" + oe.getErrorMessage());
    28. System.out.println("Error Code:" + oe.getErrorCode());
    29. System.out.println("Request ID:" + oe.getRequestId());
    30. System.out.println("Host ID:" + oe.getHostId());
    31. } catch (ClientException ce) {
    32. System.out.println("Caught an ClientException, which means the client encountered "
    33. + "a serious internal problem while trying to communicate with OSS, "
    34. + "such as not being able to access the network.");
    35. System.out.println("Error Message:" + ce.getMessage());
    36. } finally {
    37. if (ossClient != null) {
    38. ossClient.shutdown();
    39. }
    40. }
    41. }
    42. }

    3.3 集成

    在新增员工的时候,需要上传员工图片,这里一共需要做两件事:① 上传图像并进行保存;② 访问这个图像

    【执行过程】在新增员工的表单录入完毕,点击保存按钮以后,表单中的所有数据(包括图像的 url )都会提交到服务端,以此来请求新增员工的接口,最终将这个员工的信息保存到员工表中。此时 emp 对象所封装的数据,既包括员工的基本信息又包括员工的图像。

    集成步骤:

    1、引入阿里云OSS上传文件工具类(官方文档改造)

    如何通过ossutil创建Bucket并上传文件_对象存储 OSS-阿里云帮助中心 (aliyun.com)

    命令行工具ossutil_对象存储 OSS-阿里云帮助中心 (aliyun.com)

    【注】需要在该工具类上加入 @Component 注解,把这个工具类交给 IOC 容器管理

    2、上传图片接口开发 

  • 相关阅读:
    Java知识点整理 16 — Spring Bean
    关于eBPF与可观测性,你想知道的都在这里
    MVVM理解+Object.defineproperty方法+数据代理
    从电大搜题到上海开放大学,广播电视大学引领学习新风尚
    Zotero——一款文献管理工具
    【Unity插件】 BehaviorTree 原理
    Java 学习笔记
    文档图片阴影去除
    最长公共子串
    为什么CRM管理策略能增加企业利润?
  • 原文地址:https://blog.csdn.net/wohuishidalao/article/details/134517103