Springboot本地+oss存储文件上传

一、本地上传

二、oss上传


一:本地上传

废话不多说直接搂代码

html:

<body>
<form method="post" enctype="multipart/form-data" id="form">
    <input type="file" name="xxx" id="xxx">
</form>
<input type="button" value="提交" onclick="btn()">
<script src="/jquery-3.5.1.js"></script>
<script>
    /**
     * 提交文件到服务器的函数
     * 无参数
     * 无返回值
     */
    function btn() {
        // 获取文件输入元素的第一个文件
        var file = $("#xxx")[0].files[0];
        // 创建FormData对象用于存放文件数据
        var formData = new FormData();
        // 将文件添加到formData中
        formData.append("xxx",file)
 
        // 使用jQuery的ajax方法提交文件
        $.ajax({
            url:"/test/upload", // 上传的URL
            type:"post", // 请求类型为POST
            data:formData, // 文件数据
            processData:false, // 不处理数据
            contentType:false, // 不设置内容类型
            success:function (data) {
                console.log(data);
            }
        })
    }


</script>
</body>

controller:

   //用于获取配置文件中指定的文件上传路径
    @Value("${spring.servlet.multipart.location}")
    String adress;
    @RequestMapping("upload")
    public void upload(MultipartFile xxx) {
        // 获取上传文件的原始文件名
        String originalFilename = xxx.getOriginalFilename();
        // 获取文件扩展名,比如上传了图片原来的名字为1.jpg,就只截取到他的扩展名.jpg
        int i = originalFilename.indexOf(".");
        String suffix = originalFilename.substring(i);
        
        // 生成唯一的文件名,基于当前时间的毫秒数
        String pdb = "pdb" + currentTimeMillis();

        // 构建文件存储路径
        Path paths = Paths.get(adress, pdb + suffix);
        try {
            // 将上传文件的内容写入到指定路径
            Files.write(paths, xxx.getBytes());
        } catch (Exception e) {
            // 处理文件写入异常
            e.printStackTrace();
        }
    }

yml配置:

spring:
  mvc:
    view:
      prefix: /
      suffix: .html
  servlet:
    multipart:
#这里是要上传文件到的地方
      location: E:/java/img
#上传的文件大小限制
      max-file-size: 10MB

二:阿里云oss上传

什么是oss?

「OSS」的英文全称是Object Storage Service,翻译成中文就是「对象存储服务」,官方一点解释就是对象存储是一种使用HTTP API存储和检索非结构化数据和元数据对象的工具。

白话文解释就是将系统所要用的文件上传到云硬盘上,该云硬盘提供了文件下载、上传等一列服务,这样的服务以及技术可以统称为OSS,业内提供OSS服务的厂商很多,知名常用且成规模的蓝队云等。

 

步骤一:创建oss存储

 

2c54588447d343bd958616dc34a8f03e.png

上方截图步骤创建成功之后会弹出如下截图页面,请记住Endpoint的这个地址,后面后端代码中会使用到它

f24730fd41d24190b91ad15ccbb69daf.jpeg

fd97aacbc60947b7a001cb2a7b0a047c.png

OK啊这个就是我们创建好的bucket

那个又细又短的小红箭头就是我们上传文件存储的地方

里面的这个img-test文件夹是我在里面创建的,将上传的文件存放到这个文件夹里面,当然你们你也可以创建自己的

3db81cf6c50a4f198bf6734b1cc7088c.png

AccessKey ID和AccessKey Secret
是阿里云提供给用户的永久访问凭据

其中:

  • AccessKey ID 用于标识用户。
  • AccessKey Secret 用于验证用户的密钥,必须保密。

阿里云用户使用云产品的OpenAPI接口验权时需要,可从阿里云官网控制台获取,点击下图的AccessKey管理进去查看自己的ID和secret,这个也会在我们后端代码中用到

eb8cce95ccc64246aeae6fa7f35c8a4b.png

到这一步枯燥的准备工作也就完成了,现在我们可以开始我们最期待的正式环节,敲代码了

d39bf9d1cd4e4fc998292c64b015c7c5.gif

咳咳!开动开动。。。。。。

html代码就不说了,跟上面的本地上传一毛一样

第一步:首先我们添加一下所需依赖

  <!-- 引入阿里云对象存储服务(OSS)的SDK依赖 -->
        <dependency>
            <groupId>com.aliyun.oss</groupId>
            <artifactId>aliyun-sdk-oss</artifactId>
            <version>2.8.3</version>
        </dependency>

第二步:我们搞一个统一实现类

这里呢是一些关于咱们上传访问oss时的一些校验认证,要存储的地址的一些东西,并且定义一个允许上传的格式,除了自己定义的格式以外,其他不允许被上传

@Component
public class UseOss {
    //你自己的oss存储的地址
    private final String ENDPOINT="自己的Endpoint的这个地址";
    //这两个密钥是用于身份认证
    private static final String ACCESSKEYID="你自己的accessKeyId";
    private static final String ACCESSKEYSECRET="你自己的accessKeyscret";
    //存储空间的名字
    private static final String BUCKETNAME="自己的Bucket名称";
    //路径前缀
    private static final String URLPREFIX="http://自己的Bucket名称.自己的Endpoint的这个地址/";
    //创建一个oss的示例对象
    private  OSS oss=new OSSClient(ENDPOINT, ACCESSKEYID, ACCESSKEYSECRET);
    //创建一个允许上传的格式
     private static final String[] IMAGE_TYPE = new String[]{".bmp", ".jpg",
            ".jpeg", ".gif", ".png"};
}

这一块就是最核心的代码了,多的就不说了,代码一行行的注释也是显而易见了,至于下面的UUID.randomUUID()是生成为了防止文件上传时出现文件名重复的情况,生成一个随机数,保证图片名称的唯一性,意思呢大概也就是这么个意思了。

  //文件上传
    public FileUploadResult uploadFile(MultipartFile uploadFile) {
        //设置一个自变量
        boolean isLegal = false;
        //上传过来的照片与IMAGE_TYPE做比较,如果上传过来的照片的后缀是IMAGE_TYPE类型就返回true
        for (String type : IMAGE_TYPE) {
            //    // 判断上传文件的原始文件名是否以遍历的我们设置的允许上传的格式结尾,不区分大小写
            if (StringUtils.endsWithIgnoreCase(uploadFile.getOriginalFilename(),
                    type)) {
                isLegal = true;
                break;
            }
        }
        //封装Result对象,并且将文件的byte数组放置到result对象中
        FileUploadResult fileUploadResult = new FileUploadResult();
        //进入判断的逻辑是:该照片不是我们想要允许的格式,直接设置该实体类的状态,返回
        if (!isLegal) {
            fileUploadResult.setStatus("error");
            return fileUploadResult;
        }
        //如果走到这一步,说明满足所有条件的照片
        //获得文件的名字
        String fileName = uploadFile.getOriginalFilename();
        System.out.println("fileName: "+fileName); //全名加上路径
        //照片存储的路径
        String filePath = getFilePath(fileName);//文件真实存储路径,并将这个照片的名字进行改变
        System.out.println("filePath: "+filePath);//images/2db0e12b-c59e-45ef-b35d-ceb218f4d2c4.png
        // 上传到阿里云
        try {
            //根据Bucket的名字来确定是哪个存储空间,filePath存储在存储空间哪个位置,以流的形式 将uploadFile写入到filePath
            oss.putObject(this.BUCKETNAME, filePath, new
                    ByteArrayInputStream(uploadFile.getBytes()));
        } catch (Exception e) {
            e.printStackTrace();
            //上传失败
            fileUploadResult.setStatus("error");
            return fileUploadResult;
        }
        //补充实体类
        fileUploadResult.setStatus("done");
        fileUploadResult.setResponse("success");
        //this.aliyunConfig.getUrlPrefix() + filePath 文件路径需要保持数据库
        //this.aliyunConfig.getUrlPrefix()+filePath 访问照片的真实路径
        fileUploadResult.setName(this.URLPREFIX + filePath);
        fileUploadResult.setUid(String.valueOf(System.currentTimeMillis()));
        return fileUploadResult;
    }
    public  String getFilePath(String sourceFileName) {
        //获得文件后缀
        int index = sourceFileName.lastIndexOf(".");
        String suffix = sourceFileName.substring(index);
       //这里生成了一个新路径
        //在我们存储空间下的 /自己的Bucket下创建的文件夹名称/ + 随机数  + 文件后缀
        return "beifangke-test/" + UUID.randomUUID() + suffix;
    }

第三步:Controller调用一下这个工具类

    @Autowired
    UseOss useOss;
    @RequestMapping("/aliyunFile")
    public FileUploadResult aliyunFile(MultipartFile xxx) {
        FileUploadResult fileUploadResult = useOss.uploadFile(xxx);
        return fileUploadResult;
    }

咱们上传一下LookLook!

当控制台接收到这个返回的时候也就算是OK了

345c0b7156cb4aa3a7397eb611b39e86.png

 

咱们点开自己创建的文件夹瞅一眼,呕吼!哥们的三国杀移动版新皮肤钟会.潜蛟觊天(动+静)图片也算是上传出来了,非常帅啊!

74e355a2e3164860bcbcec737e783331.png

cc3e9ea240b14e4bbec3823657907787.png

 

  • 26
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值