JavaWeb开发——文件上传

1 简介

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

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

前端程序

JavaWeb开发——文件上传_第1张图片

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

服务端接收文件

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

JavaWeb开发——文件上传_第2张图片

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

 MultipartFile 常用方法:JavaWeb开发——文件上传_第3张图片

2 本地存储

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

JavaWeb开发——文件上传_第4张图片

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

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

代码优化  

JavaWeb开发——文件上传_第5张图片

JavaWeb开发——文件上传_第6张图片

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

3 阿里云OSS

3.1 准备

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

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

JavaWeb开发——文件上传_第7张图片

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

AccessKey:包含AccessKey ID以及AccessKey Secret

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

3.2 入门

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

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

import com.aliyun.oss.ClientException;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.OSSException;
import com.aliyun.oss.common.auth.CredentialsProviderFactory;
import com.aliyun.oss.common.auth.EnvironmentVariableCredentialsProvider;
import java.io.ByteArrayInputStream;

public class Demo {

    public static void main(String[] args) throws Exception {
        // Endpoint以华东1(杭州)为例,其它Region请按实际情况填写。
        String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
        // 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
        EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
        // 填写Bucket名称,例如examplebucket。
        String bucketName = "examplebucket";
        // 填写Object完整路径,例如exampledir/exampleobject.txt。Object完整路径中不能包含Bucket名称。
        String objectName = "exampledir/exampleobject.txt";

        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(endpoint, credentialsProvider);

        try {
            String content = "Hello OSS";
            //创建PutObject请求
            ossClient.putObject(bucketName, objectName, new ByteArrayInputStream(content.getBytes()));
        } catch (OSSException oe) {
            System.out.println("Caught an OSSException, which means your request made it to OSS, "
                    + "but was rejected with an error response for some reason.");
            System.out.println("Error Message:" + oe.getErrorMessage());
            System.out.println("Error Code:" + oe.getErrorCode());
            System.out.println("Request ID:" + oe.getRequestId());
            System.out.println("Host ID:" + oe.getHostId());
        } catch (ClientException ce) {
            System.out.println("Caught an ClientException, which means the client encountered "
                    + "a serious internal problem while trying to communicate with OSS, "
                    + "such as not being able to access the network.");
            System.out.println("Error Message:" + ce.getMessage());
        } finally {
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }
    }
}

3.3 集成

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

JavaWeb开发——文件上传_第8张图片

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

集成步骤:

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

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

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

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

JavaWeb开发——文件上传_第9张图片

2、上传图片接口开发 

JavaWeb开发——文件上传_第10张图片

你可能感兴趣的:(JavaWeb开发,java)