【javaWeb & 功能介绍第一篇】阿里云OSS文件上传

文件上传

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

文件上传在项目中应用十分广泛,我们经常发微博,发微信都用到了文件上传的功能

在前端的开发之中,如果需要文件上传功能,则必须在form表单中进行定义,且提交方式必须是post(因为文件的内容比较大),表单的数据格式也必须设置为multipart/form-data(因为文件的内容比较大)

<form action="" method="post" enctype="multipart/form-data">
头像:<input type="file" name="image">
</form>

在idea中后端接收文件:
在这里插入图片描述
在接受的方法中面对传递过来的数据文件,我们使用MultipartFile对象接收文件,通过断点测试,发现当传回来的文件中给出一段地址,打开地址是三个临时文件,分别对应三个参数,当通过运行之后发现文件消失,所以需要在后续保存文件

存储文件

本地存储

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

    @PostMapping("/upload")
    public Result upload(String username, Integer age, MultipartFile image) throws Exception{
        log.info("文件上传:{},{},{}",username,age,image);
        //获取原始文件名
        String originalFilename = image.getOriginalFilename();
        //将文件转存到服务器的磁盘目录当中
        image.transferTo(new File("E:\\images\\"+originalFilename));
        return Result.success();
    }

对待文件的集成方法已经涵盖在了MultipartFile对象之中,transferTo可以指定将文件保存在指定目录下

但是这样会出现一个问题,采用原始数据名保存,当下一个名字相同的文件再次传输上来会覆盖之前的文件,这样就会出现问题,所以需要构造唯一的文件名
这个文件名就使用uuid(通用唯一识别码)
在对这个文件进行命名的时候采用 uuid+ 文件名后缀来进行命名

        //构造唯一标识码
        int i = originalFilename.indexOf(".");
        String substring = originalFilename.substring(i);
        String newFileName= UUID.randomUUID().toString()+substring.toString();
        log.info("新的文件名:{}",newFileName);
        //将文件转存到服务器的磁盘目录当中
        image.transferTo(new File("E:\\images\\"+newFileName));

通过UUID类来创建唯一标识的字符串,并将拼接好的字符串加入到路径字符串

当上传文件服务器端出现如下错误:
报错
这个错误说明当前请求的文件超过了文件大小限制,在spring中默认单个文件上传的最大大小为1M,如果需要上传大文件,可进行如下配置:

//配置单个文件最大上传大小
spring.servlet.multipart.max-file-size=10MB   //默认为1M
//配置单个请求最大的上传大小(一次请求可以上传多个文件)
spring.servlet.multipart.max-request-size=100MB     //默认为10M
  • 文件存储本地的弊端
  1. 存储在服务器磁盘目录的数据文件,在最后是无法在前端页面上展现的
  2. 磁盘容量有限

常用方法:MultipartFile类中
在这里插入图片描述

云服务

为了处理本地存储的弊端,现在采用的存储方式

  • 第一种:自主搭建

项目组自己搭建一套存储服务来自己存储上传的文件例如:

  1. FastDFS分布式文件系统
  2. Minlo对象存储服务集群

这个需要项目私人储备服务器

  • 第二种:云服务

大型互联网公司提供的云服务服务器,比如阿里云OSS

阿里云

阿里云是阿里巴巴集团旗下的全球领先的云计算公司,也是国内最大的云服务提供商
云服务
阿里云不只由存储服务平台,还有提前设置好的各种功能服务

阿里云对象存储OSS(Object Storage Service)是一款海量,安全,低成本,高可靠的云存储服务,使用OSS,您可以通过网络随时存储和调用包括文本,图片,音频和视频等在内的各种文件

  • 如何使用阿里云OSS
  1. 登录注册,简单配置
  2. 参照官方SDK编写入门程序

SDK:软件开发工具包,包括辅助软件开发依赖(jar包),代码示例等,都可叫做SDK

  1. 在项目中集成使用

准备工作:
在这里插入图片描述

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

阿里云地址:https://www.aliyun.com
创建Bucket:
在这里插入图片描述
填写名称,一般地域选择默认,剩下的一般默认,读写权限设置为公共读

获取AccessKey密钥:
在这里插入图片描述
右上角的头像,选择AccessKey管理

  • SDK

在左侧的栏中找到SDK下载,点击SDK示例
在这里插入图片描述

点击后出现官方文档,点击在文档中心打开,查看SDK文档找到对应的操作
这里找到Maven项目下的官方依赖

在SDK文档中找到关于Java文件上传的文档,进行简单修改

  • 阿里云OSS集成

当前端传输上传一张图片的时候:

  1. 在Controller类中接收上传的图片
  2. 将图片储存起来(OSS)
  3. 返回图片访问的URL
  • 开发文件上传接口
  1. 引入阿里云OSS上传文件工具类(由官方的示例代码改造而来)
  2. 上传图片接口开发
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Result {
    private Integer code;  //响应码,1代表成功,0表示失败
    private String msg; //响应信息,描述字符串
    private Object data;//返回的数据
    public static Result success(){ //增删改,成功响应
        return new Result(1,"success",null);
    }
    public static Result success(Object data){//查询 成功响应
        return new Result(1,"success",data);
    }
    public static Result success(String msg){//失败响应
        return new Result(0,msg,null);
    }
}
  • 20
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于JavaWeb应用程序,您可以使用OSS SDK提供的Multipart Upload API来实现文件分片上传OSS文件服务器。下面是一个简单的示例代码,演示如何使用Java SDK实现文件分片上传OSS。 ```java public class OSSFileUploader { // 阿里云OSS的Access Key ID和Access Key Secret private static final String ACCESS_KEY_ID = "<your_access_key_id>"; private static final String ACCESS_KEY_SECRET = "<your_access_key_secret>"; // 阿里云OSS的Endpoint private static final String ENDPOINT = "<your_endpoint>"; // 阿里云OSS的Bucket名称 private static final String BUCKET_NAME = "<your_bucket_name>"; // 阿里云OSS的Object名称(即上传OSS后的文件名) private static final String OBJECT_NAME = "<your_object_name>"; // 每个分片的大小(单位:字节) private static final int PART_SIZE = 1024 * 1024; // 初始化OSSClient对象 private static final OSSClient client = new OSSClient(ENDPOINT, ACCESS_KEY_ID, ACCESS_KEY_SECRET); /** * 将指定文件上传阿里云OSS * * @param filePath 要上传的文件路径 */ public static void upload(String filePath) throws Exception { // 初始化一个MultipartUpload请求 InitiateMultipartUploadResult initResult = client.initiateMultipartUpload(BUCKET_NAME, OBJECT_NAME); // 获取Upload ID,用于后续的分片上传 String uploadId = initResult.getUploadId(); // 计算文件分片数量 File file = new File(filePath); long fileSize = file.length(); int partCount = (int) Math.ceil((double) fileSize / PART_SIZE); // 将文件分成多个分片上传 List<PartETag> partETags = new ArrayList<PartETag>(); for (int i = 0; i < partCount; i++) { // 计算分片的起始位置和长度 long startPos = i * PART_SIZE; long partSize = Math.min(PART_SIZE, fileSize - startPos); // 读取分片数据 RandomAccessFile raf = new RandomAccessFile(file, "r"); raf.seek(startPos); byte[] partData = new byte[(int) partSize]; raf.read(partData); raf.close(); // 上传分片数据 UploadPartRequest uploadRequest = new UploadPartRequest(); uploadRequest.setBucketName(BUCKET_NAME); uploadRequest.setKey(OBJECT_NAME); uploadRequest.setUploadId(uploadId); uploadRequest.setPartNumber(i + 1); uploadRequest.setInputStream(new ByteArrayInputStream(partData)); uploadRequest.setPartSize(partSize); UploadPartResult uploadResult = client.uploadPart(uploadRequest); // 获取分片的ETag,并保存到列表中 partETags.add(uploadResult.getPartETag()); } // 完成上传操作 CompleteMultipartUploadRequest completeRequest = new CompleteMultipartUploadRequest(BUCKET_NAME, OBJECT_NAME, uploadId, partETags); client.completeMultipartUpload(completeRequest); } } ``` 在上述示例代码中,`upload()`方法接受要上传的文件路径,并将文件分成多个分片进行上传,最终完成整个上传操作。需要注意的是,每个分片的大小可以根据具体情况进行调整。另外,您需要将代码中的ACCESS_KEY_ID、ACCESS_KEY_SECRET、ENDPOINT、BUCKET_NAME和OBJECT_NAME替换成您自己的阿里云OSS相关信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值