基于springboot的文件的上传到本地和云上传(阿里云)

news2024/11/24 13:48:30

1.文件上传

1.介绍

  • 文件上传,是指将本地图片、视频、音频等文件上传到服务器,供其他用户浏览或下载的过程。
  • 文件上传在项目中应用非常广泛,我们经常发微博、发微信朋友圈都用到了文件上传功能。

2.前端的文件上传–form表单

  • 将静态的页面资源放到static资源包下,upload.html文件代码如下
<form action="/upload" method="post" enctype="multipart/form-data">
	姓名:<input type="text" name="username"><br>
	年龄: <input type="text" name="age"><br>
	头像:<input type="file" name="image"><br>
    <input type="submit" value="提交">
</form>

在这里插入图片描述

enctype="multipart/form-data":必须设置表单编码格式参数为multipart/form-data,因为普通默认的编码格式不适合传输大型数据 。

关于enctype的介绍:
在这里插入图片描述

3.服务端接收文件

  • 建立Controller层的代码:
@Slf4j
@RestController
public class UploadController {
   @PostMapping("/upload")
   public Result upLoad(String username, Integer age, MultipartFile image) {
       log.info("文件的上传,参数:{},{},{}", username, age, image);
       return Result.success();
   }
}

接收时的必要参数:MultipartFile(Java中提供的api接口) ,在接收参数时会产生一个临时文件,等待上传成功时候临时文件会自动的删除。

2.文件的存储

1.本地存储

  • 在服务端,接收到上传上来的文件之后,将文件存储在本地服务器磁盘中。废话不说直接上代码(同样也是Controller层):
@Slf4j
@RestController
public class UploadController {
    @PostMapping("/upload")
    public Result upLoad(String username, Integer age, MultipartFile image) throws IOException {
        log.info("文件的上传,参数:{},{},{}", username, age, image);
        //获取文件原始名
        String originalFilename = image.getOriginalFilename();

        //构造唯一的文件名  uuid(通用唯一识别码--长度固定的字符串 de49685b-6lc0-4b11-80fa-c7le95924018)
        int index = originalFilename.lastIndexOf(".");
        String extName = originalFilename.substring(index);//获取后缀文件名
        String newFileName= UUID.randomUUID().toString()+extName;
        log.info("获取到的文件名:{}",newFileName);

        //将文件存入指定的目录
        image.transferTo(new File("D:\\resources\\" + newFileName));
        return Result.success();
    }
}

但是这种方式只能上传的文件大小只有1MB,超出之后就要配置一下application.properties文件:

#配置单个文件最大上传大小
spring.servlet.multipart.max-file-size=10MB
#配置单个请求最大上传大小(一次请求可以上传多个文件,多个文件的总大小不能超过设置值)
spring.servlet.multipart.max-request-size=100MB

2.阿里云介绍

  • 阿里云:阿里云是阿里巴巴集团旗下全球领先的云计算公司,也是国内最大的云服务提供商。
  1. 阿里云OSS
  • 阿里云对象存储OSS (Object Storage Service),是一款海量、安全、低成本、高可靠的云存储服务。使用OSS,您可以通过网络随时存储和调用包括文本、图片、音频和视频等在内的各种文件。
  1. 第三方服务的通用思路
  • 准备工作->参照官方SDK编写入门程序->集成使用

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

  1. 阿里云OSS–使用步骤
  • 准备工作:注册阿里云(实名认证)->充值->开通对象存储服务(0SS)->创建bucket->获取AccessKey(秘钥)

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

  1. 参考阿里云文档进行快速入门

3.阿里云OSS集层开发–基于阿里云的云上传

  1. 步骤:
  • (1)引入阿里云OSS上传文件工具类(由官方的示例代码改造而来),示例:
package com.mannor.utils;

import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;
import java.io.*;
import java.util.UUID;

/**
 * 阿里云 OSS 工具类
 */
@Component   //交给了IOC容器管理--实现对此工具类进行操作
public class AliOSSUtils {

    private String endpoint = "https://oss-cn-chengdu.aliyuncs.com";
    private String accessKeyId = "yourAccessKeyId";
    private String accessKeySecret = "yourAccessKeySecret";
    private String bucketName = "mannor-tlias";

    /**
     * 实现上传图片到OSS
     */
    public String upload(MultipartFile file) throws IOException {
        // 获取上传的文件的输入流
        InputStream inputStream = file.getInputStream();

        // 避免文件覆盖
        String originalFilename = file.getOriginalFilename();
        String fileName = UUID.randomUUID().toString() + originalFilename.substring(originalFilename.lastIndexOf("."));

        //上传文件到 OSS
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
        ossClient.putObject(bucketName, fileName, inputStream);

        //文件访问路径
        String url = endpoint.split("//")[0] + "//" + bucketName + "." + endpoint.split("//")[1] + "/" + fileName;
        // 关闭ossClient
        ossClient.shutdown();
        return url;// 把上传到oss的路径返回
    }

}

  • (2)上传图片接口开发,代码:
package com.mannor.Controller;

import com.mannor.pojo.Result;
import com.mannor.utils.AliOSSUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;

@Slf4j
@RestController
public class UploadController {

    @Autowired
    private AliOSSUtils aliOSSUtils;   //使用bean对象
 
    @PostMapping("/upload")
    public Result upLoad(MultipartFile image) throws IOException {
        log.info("文件的上传,文件名:{}", image.getOriginalFilename());
        String url = aliOSSUtils.upload(image);   //返回值为文件的URL
        log.info("文件上传完成,文件URl是:{}", url);
        return Result.success(url);
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/663393.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

接口自动化测试面试问题及答案

目录 1.请问你是如何做接口测试的&#xff1f; 2.接口测试如何设计测试用例&#xff1f; 3.接口测试执行中需要比对数据库吗&#xff1f; 4.接口测试质量评估标准是什么&#xff1f; 5.接口产生的垃圾数据如何清理 6.其他接口要先获取接口信息&#xff0c;如何让登录的接口…

化工园区人员全过程轨迹化安全解决方案

1、项目背景 化工园区化工厂是生产安全重点单位&#xff0c;对人员定位管理需求强烈。对人员定位主要需求是&#xff1a;一般区域人数统计、人员轨迹、重点区域人员实时精准定位。 华安联大安全化工园区人员全过程轨迹化安全解决方案通过人员实时定位管理、移动轨迹追溯、险情…

《项目实战》构建SpringCloud alibaba项目(二、构建微服务鉴权子工程store-authority-service)

系列文章目录 构建SpringCloud alibaba项目&#xff08;一、构建父工程、公共库、网关&#xff09; 构建SpringCloud alibaba项目&#xff08;二、构建微服务鉴权子工程store-authority-service&#xff09; 文章目录 系列文章目录前言1、在公共库增加 UserInfo类2、微服务鉴权…

初识SLAM

SLAM的作用 想象一个叫小萝卜的机器人&#xff0c;小萝卜在未知环境走&#xff0c;肯定想让小萝卜在脑海中记住两件事&#xff1a; 1. 我在什么地方&#xff1f;——定位。 2. 周围环境是什么样&#xff1f;——建图。 这就和我们逛一个旅游景点一样&#xff0c;我们会潜意识…

清华青年AI自强作业hw3_3:用NN网络拟合MNIST手写数字分类

清华青年AI自强作业hw3_3&#xff1a;用NN网络拟合MNIST手写数字分类 实现过程具体思路多分类网络模型训练结果分析 相关链接 一起学AI系列博客&#xff1a;目录索引 hw3_3&#xff1a;用NN网络拟合MNIST手写数字分类 体会神经网络设计和TF框架编程 对比hw3_1两者的模型、效果…

CLIP和GPT

CLIP CLIP下游应用&#xff1a;VQGAN、DALL-ECLIP-Event:Connecting Text and Images with Event StructuresHierarchical Text-Conditional Image Generation with CLIP LatentsGPT系列算法GPT-1&#xff1a;GPT-2&#xff1a;GPT-3&#xff1a;GPT-3应用&#xff1a;Evaluati…

关于Win搜索太慢我自己写了一个Everything

文章目录 前言使用工具使用技术实现功能关于使用的技术比较OUTJDBC构建数据库FileMetasize处理文件最后修改时间equals重写其他方法 dao数据库源头获取连接关闭资源连接 FileDao初始化插入文件/目录到数据库中查询数据删除数据 特殊处理方法实现测试 服务初始化服务方法 操作单…

简要介绍 | 基于Python的图像形态学处理概述

注1&#xff1a;本文系“简要介绍”系列之一&#xff0c;仅从概念上对基于Python的图像形态学处理进行非常简要的介绍&#xff0c;不适合用于深入和详细的了解。 基于Python的图像形态学处理概述 Digital terrain models from airborne laser scanning for the automatic extra…

蓝牙芯片PHY6222的一些基本信息

摘要&#xff1a;本文简要介绍一下硬件工程师需要关注的PHY6222蓝牙芯片重点信息。 这个蓝牙芯片&#xff0c;支持蓝牙5.2. 内核是ARM Cortex™-M0 32-bit processor &#xff0c;这就证明它可以像开发STM32那样来为它开发程序。 具有SWD调试接口&#xff0c;那么就可以用少到…

论文解读:Splicing ViT Features for Semantic Appearance Transfer

Project webpage: https://splice-vit.github.io Abstruct 将两张图片中语义相近的目标的结构和风格&#xff08;外观&#xff09;拼接 • 输入一个 Structure/ Appearence 图像对 &#xff1a; 训练生成器 。 • 关键思想是利用 预训练 和固定的视觉转换器 ( ViT ) 模型&…

Smartbi内置用户登陆绕过漏洞复现

0x01 产品简介 Smartbi大数据分析产品融合BI定义的所有阶段&#xff0c;对接各种业务数据库、数据仓库和大数据分析平台&#xff0c;进行加工处理、分析挖掘和可视化展现&#xff1b;满足所有用户的各种数据分析应用需求&#xff0c;如大数据分析、可视化分析、探索式分析、复杂…

Push vs Pull

Push好在两点&#xff1a;1.把结果下推到下流节点&#xff0c;与控制流解耦合&#xff0c;有利于cache 2.对于有向无环图&#xff0c;而不仅仅是树的query plan有更好的效果 解释&#xff1a; pull伪代码 push 伪代码 解释一下push&#xff0c;就是把操作下推到叶子节点&#…

4-JVM类加载

目录 1.类加载过程 1.1.加载&#xff08;去车站&#xff09; 1.2.验证&#xff08;过安检&#xff09; 1.3.准备&#xff08;候车&#xff09; 1.4.解析&#xff08;检票&#xff09; 1.5.初始化&#xff08;上车&#xff09; 2.双亲委派模型 2.1.什么是双亲委派模型&a…

首次曝光!乔布斯这些从未公开的照片,揭露乔布斯的另一面

昨个&#xff0c;大神在群里分享了一本关于乔布斯的书籍。 这本书收录了他的照片、电子邮件、演讲稿和访谈&#xff0c;很多私人的邮件和访谈是第一次看到。 书中用乔布斯自己的视角&#xff0c;记录了他一生的轨迹&#xff0c;包括他的童年&#xff0c;创立、离开、重归苹果的…

【Matter】如何在Linux平台下测试Matter应用级通信(虚拟设备)

如何在Linux平台下测试Matter应用级通信(虚拟设备) 准备工作 1. 递归克隆Matter仓库 执行如下命令&#xff1a; git clone --recurse-submodules gitgithub.com:project-chip/connectedhomeip.git如果克隆过程中发生报错&#xff0c;请执行如下命令来同步子模块&#xff1a;…

【好书精读】网络是怎样连接的 之 委托协议栈发送消息

&#xff08;该图由AI制作 学习AI绘图 联系我&#xff09; 目录 数据收发操作概览 创建套接字阶段 连接阶段&#xff1a;把管道接上去 通信阶段&#xff1a;传递消息 断开阶段&#xff1a;收发数据结束 数据收发操作概览 知道了 IP 地址之后 &#xff0c; 就可以委托操…

Spring Boot高阶篇笔记

一、Spring Boot整合Redis缓存 JSR-107、Spring缓存抽象、整合Redis 1、JSR107 Java Caching定义了5个核心接口&#xff0c;分别是CachingProvider, CacheManager, Cache, Entry 和 Expiry。 • CachingProvider定义了创建、配置、获取、管理和控制多个CacheManager。一个应…

打造Top级期货交易系统!成为投资高手!

交易系统在期货市场中得到广泛的应用&#xff0c;技术分析是期货交易系统的重要组成部分之一。技术分析是依靠市场数据来预测未来期货行情的一种方法&#xff0c;通过对期货历史市场信息进行形态分析和统计计算等手段&#xff0c;获取市场行情的走向&#xff0c;为后续的期货交…

初识MFC第一天

文章目录 前言一、初识MFC二、初始相关API附录 前言 刚开始进入Win32开发时&#xff0c;会发现一些变量类型似乎在C语言中未曾见过。其实这些变量类型或是与C/C已有的数据类型相近的&#xff0c;是通过C语言的原始类型重新定义而成的。引入这些数据类型的主要目的是为了便于程…

2023届网课生就业难:挑战与策略探析

&#x1f337;&#x1f341; 博主 libin9iOak带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——libin9iOak的博客&#x1f390; &#x1f433; 《面试题大全》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33…