做一个Springboot文件上传-阿里云

概述

        这个模块是用来上传头像以及文章封面的,图片的值是一个地址字符串,一般存放在本地或阿里云服务中

1、本地文件上传

        我们将文件保存在一个本地的文件夹下,由于可能两个人上传不同图片但是却同名的图片,那么就会一个人的图片就会覆盖住另一个人的图片。因此我们需要使用UUID来保证我们的图片名字不重复。

tomcat默认的最大文件上传大小为1mb,超过就会报错,我们可以更改一下配置

spring:
  servlet:
    multipart.max-file-size: 50MB
    multipart.max-request-size: 50MB


server:
  max-http-form-post-size: -1

代码实现

Controller

@RestController
public class FileUploadController {

    @PostMapping("/upload")
    public Result<String> upload(MultipartFile file) throws IOException {
        //把文件的内容
        String originalFilename = file.getOriginalFilename();

        //保证文件的名字是唯一的,后缀加上.png
        String fileName = UUID.randomUUID().toString() +
                originalFilename.substring(originalFilename.lastIndexOf("."));

        file.transferTo(new File("D:\\JAVA_project\\big-event\\src\\main\\resources\\static\\files\\" +
                fileName));

        return Result.success("url访问地址...");
    }
}

测试

 

上传同一个文件三次且没有覆盖


2、阿里云OSS

非官方解释:互联网上的一些远程服务器,可供你使用。

阿里云是阿里巴巴集团下全球领先的云计算公司,也是国内最大的云服务提供商。

我们选择阿里云OSS云服务器,第一次使用赠送三个月20G的试用

我们直接将图片或文件直接存储在阿里云oss上即可

创建一个bucket 

进入bucket

点击AccessKey管理

创建一个AccessKey,这个就相当于账号和密码了,不要泄露

使用方法

引入依赖

<dependency>
    <groupId>com.aliyun.oss</groupId>
    <artifactId>aliyun-sdk-oss</artifactId>
    <version>3.15.1</version>
</dependency>

如果使用的是Java 9及以上的版本,则需要添加jaxb相关依赖。添加jaxb相关依赖示例代码如下 

<dependency>
    <groupId>javax.xml.bind</groupId>
    <artifactId>jaxb-api</artifactId>
    <version>2.3.1</version>
</dependency>
<dependency>
    <groupId>javax.activation</groupId>
    <artifactId>activation</artifactId>
    <version>1.1.1</version>
</dependency>
<!-- no more than 2.3.3-->
<dependency>
    <groupId>org.glassfish.jaxb</groupId>
    <artifactId>jaxb-runtime</artifactId>
    <version>2.3.3</version>
</dependency>

阿里云中提供了现成的解释文档供我们使用,我们直接将其中的案例demo拿过来改成我们自己的工具类

package com.wal.bigevent.util;

import com.aliyun.oss.ClientException;
import com.aliyun.oss.OSS;

import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.OSSException;
import com.aliyun.oss.model.PutObjectRequest;
import com.aliyun.oss.model.PutObjectResult;

import java.io.File;
import java.io.InputStream;

public class AliOssUtil {
    // Endpoint以华东1(杭州)为例,其它Region请按实际情况填写。
    private static final String Endpoint = "https://oss-cn-beijing.aliyuncs.com";
    // 填写Bucket名称,例如examplebucket。
    private static final String bucketName = "big-event-wal";
    private static final String AccessKeyId = "LTAI5tCLBwaVPB2MA3Lhu2vo";
    private static final String AccessKeySecret = "q0j64AWJkJG2LMH8oDycfomen8saV1";

    public static String uploadFile(String objectName, InputStream in) throws Exception {
//        EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();

        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(Endpoint,AccessKeyId,AccessKeySecret);

        String url = "";
        try {
            // 填写字符串。
            String content = "Hello OSS,你好世界";

            // 创建PutObjectRequest对象。
            PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName,objectName ,in);

            // 如果需要上传时设置存储类型和访问权限,请参考以下示例代码。
            // ObjectMetadata metadata = new ObjectMetadata();
            // metadata.setHeader(OSSHeaders.OSS_STORAGE_CLASS, StorageClass.Standard.toString());
            // metadata.setObjectAcl(CannedAccessControlList.Private);
            // putObjectRequest.setMetadata(metadata);

            // 上传字符串。
            PutObjectResult result = ossClient.putObject(putObjectRequest);

            url = "https://" + bucketName + "." + Endpoint.substring(Endpoint.lastIndexOf("/") + 1)+ "/" +objectName;

        } 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();
            }
        }
        return url;
    }
}

将之前的本地上传的Controller更改

@RestController
public class FileUploadController {

    @PostMapping("/upload")
    public Result<String> upload(MultipartFile file) throws Exception {
        //把文件的内容
        String originalFilename = file.getOriginalFilename();

        //保证文件的名字是唯一的,后缀加上.png
        String fileName = UUID.randomUUID().toString() +
                originalFilename.substring(originalFilename.lastIndexOf("."));

//        file.transferTo(new File("D:\\JAVA_project\\big-event\\src\\main\\resources\\static\\files\\" +
//                fileName));

        String url = AliOssUtil.uploadFile(fileName, file.getInputStream());
        

        return Result.success(url);
    }
}

测试

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C++模拟实现——红黑树

一、介绍 红黑树也是对一般的搜索二叉树不能保证平衡的一个改进&#xff0c;和AVL树采用的思路不同&#xff0c;但同样需要旋转&#xff0c;其本质也是一颗平衡搜索二叉树&#xff0c;其节点有颜色的区分&#xff0c;并且被一些规则束缚&#xff0c;在这些规则下&#xff0c;能…

从《lc42 接雨水》到《lc84 柱状图中的最大矩形》

1 LC42 接雨水 1.1 答案 解法四&#xff1a;双指针 动态规划中&#xff0c;我们常常可以对空间复杂度进行进一步的优化。 例如这道题中&#xff0c;可以看到&#xff0c;max_left [ i ] 和 max_right [ i ] 数组中的元素我们其实只用一次&#xff0c;然后就再也不会用到了。所…

Niushop单商户及多商户v5商城系统第三方商业插件cps联盟视频购物及多包装库存转换的安装

一、后端安装 把video文件夹直接上传到addon目录下即可登录后台&#xff0c;设置->系统维护->插件管理->未安装插件&#xff0c;找到插件直接安装即可 3.在营销->营销中心->营销活动&#xff0c;找到视频列表这个插件&#xff0c;点击进去配置视频即可 4.装…

13.(vue3.x+vite)组件间通信方式之provide与inject

前端技术社区总目录(订阅之前请先查看该博客) 示例效果 依赖注入Provide / Inject 在父子组件传递数据时,通常使用的是 props 和 emit,父传子时,使用的是 props,如果是父组件传孙组件时,就需要先传给子组件,子组件再传给孙组件,如果多个子组件或多个孙组件使用时,就…

社区论坛小程序源码系统,功能齐全,页面简洁,前端+后端+完整部署教程

现如今&#xff0c;社区论坛已经成为人们交流思想&#xff0c;分享经验&#xff0c;获取信息的重要平台。近年来&#xff0c;小程序的出现更是改变了传统的网站建设方式&#xff0c;让用户体验更加便捷&#xff0c;高效。今天源码小编来和大家分享一款社区论坛小程序源码系统&a…

最强大模型训练芯片H200发布!141G大内存,AI推理最高提升90%,还兼容H100

梦晨 克雷西 发自 凹非寺 量子位 | 公众号 QbitAI 英伟达老黄&#xff0c;带着新一代GPU芯片H200再次炸场。 官网毫不客气就直说了&#xff0c;“世界最强GPU&#xff0c;专为AI和超算打造”。 听说所有AI公司都抱怨内存不够&#xff1f; 这回直接141GB大内存&#xff0c;与…

IDEA创建JavaFX项目

1、New -> Project 2、选择JavaFX 配置项目名&#xff0c;包名&#xff0c;lib包管理工具&#xff0c;JDK版本&#xff08;注&#xff0c;JDK版本最低需要11&#xff09; 3、选择lib包 根据自己需求选择 lib包介绍 BootstrapFX&#xff1a;BootstrapFX 是一个为 JavaFX 提…

mysql数据库超过最大连接数

mysql 超过数据库最大连接数解决办法 1、报错信息 首先无论是navicat 执行sql还是 用idea启动多的服务都会有如下报错信息&#xff1a; 2、解决办法 2.1命令方式修改 这种方法是由其他资料提供的。这种修改方式是临时的&#xff0c;如果mysql服务重启设置就会还原&#xff…

解决Python中使用requests库遇到的身份验证错误

在使用requests库进行HTTP请求时&#xff0c;用户遇到了一个AuthenticationRequired&#xff08;身份验证必须&#xff09;的错误。然而&#xff0c;当使用urllib.request.urlopen执行相同的操作时&#xff0c;却能够成功。同时&#xff0c;用户提供了自己的系统信息&#xff0…

Flink 整合 hudi

1、hudi介绍&#xff1a; Hudi 是一个开源的大数据存储和处理框架&#xff0c;通过提供数据表、写入、读取、更新和删除等功能&#xff0c;实现了高效的增量数据处理和数据管理。它广泛应用于大数据领域&#xff0c;为数据湖环境下的数据操作提供了强大的支持。不仅可以存储数…

D-阿强与网格

题目链接 : 阿强与网络 思路 : 数学模拟; 详情请看代码 : 代码 : #include<iostream> #include<algorithm> using namespace std; typedef long long LL; int main(){int t ; scanf("%d",&t);LL ans,m,n,x,y;while(t--){scanf("%lld%lld…

流量分析(5.5信息安全铁人三项赛数据赛题解)

黑客通过外部的web服务器攻击到企业内部的系统中&#xff0c;并留下了web后门&#xff0c;通过外部服务器对内部进行了攻击。 目录 黑客攻击的第一个受害主机的网卡IP地址 黑客对URL的哪一个参数实施了SQL注入 第一个受害主机网站数据库的表前缀(加上下划线 例如abc_) 第一…

win10资源管理器占用CPU过高导致卡顿

win10 打开几个文件夹后 资源管理器占用CPU 飙升&#xff0c;卡的很难受&#xff0c;网上找了几个办法 关闭 小娜&#xff0c;关闭搜索 什么的 都没明显改善&#xff0c;还有损招&#xff0c;重启资源管理器&#xff0c;重启一次 20多秒&#xff0c;要不了多长时间就会再次卡…

2023中国跨境电商出海成功品牌TOP5:跨境独立站

1 中国跨境电商出海最佳品牌 通过搭建跨境电商独立站&#xff0c;完善多渠道战略&#xff0c;并获取更多品牌自主权与更高利润率已是大势所趋。以下整理了外媒评选出的中国跨境电商出海最佳品牌&#xff08;指拥有“跨境电商独立站”并持有“自有品牌”的公司&#xff09;。本…

二维码智慧门牌管理系统升级解决方案:标准地址ID查询服务:高效、精准

文章目录 前言一、解决查询效率低下的问题二、提高信息精准度三、应用案例 前言 随着城市的发展和信息化步伐的加快&#xff0c;二维码智慧门牌管理系统已成为各大城市管理部门和企事业单位的必备工具。然而&#xff0c;实际应用中存在一些问题&#xff0c;如查询效率低下、信…

Sql Prompt 10下载安装图文教程

在操作过程中&#xff0c;请暂时关闭你的防病毒软件&#xff0c;以免其误报导致操作失败。 资源 SQL Prompt 10 https://www.aliyundrive.com/s/QuMWkvE1Sv6 点击链接保存&#xff0c;或者复制本段内容&#xff0c;打开「阿里云盘」APP &#xff0c;无需下载极速在线查看&…

web基础和http协议(粗糙版)

服务部署&#xff0c;集训&#xff0c;分布式&#xff0c;数据库&#xff0c;日志系统&#xff0c;等二阶段 web基础和http协议&#xff1a; web的相关基础知识&#xff0c;包括域名 dns解析 网页的概念以及http协议 1.网络当中通信&#xff1a;端口 ip 协议 tcp/ip 传输过程…

CPS-8910

PCI Express&#xff0c;有线开关设备 CPS-8910专为在PXI平台或软件无线电设备上实现大型多输入多输出(MIMO)扩展配置和系统控制而设计。 CPS-8910提供了2个PCI Express上行端口和8个下行端口来实现无缝系统扩展。 下行端口可以连接软件无线电可重配置设备等外部设备&#xff0…

抖音直播招聘报白企业人力资源有招聘需求的看过来

人力资源行业抖音招聘报白开始了&#xff0c;但是目前的市面的价格不一&#xff0c;很多人力资源公司最近想做抖音的直播报白&#xff0c;做直播待岗&#xff0c;因为最近刚好是招聘高峰期啊&#xff0c;企业需求大&#xff0c;赶上这一波&#xff0c;但是对目前市面上做抖音报…

前后端设置跨域问题

前端 const {defineConfig} require(vue/cli-service) module.exports defineConfig({transpileDependencies: true,devServer: { //记住&#xff0c;别写错了devServer//设置本地默认端口 选填port: 8080,proxy: { //设置代理&#xff0c;必…