• 文件上传学习笔记


    笔记

    文件上传

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

    • 文件上传前端三要素 :

      • file表单项

      • post方式

      • multipart/from-data

    • 服务端接收文件 : 用spring中的API : MultipartFile

    • 要想文件名唯一 : 可以使用uuid技术

    • 在SpringBoot中,文件上传,默认的单个文件最大允许最大大小为1M,如果需要上传大文件,可以在application.properties中进行如下配置:

      1. #配置单个文件最大上传大小
      2. spring.servlet.multipart.max-file-size=10MB
      3. #配置单个请求最大上传大小(一次请求可以上传多个文件)
      4. spring.servlet.multipart.max-request-size=100MB

    • 文件的本地存储 :

      image.transferTo(new File("pathname"));

    • 本地存储 : 无法直接访问 , 磁盘空间限制 , 磁盘损坏

    • OSS :

      • 为每一个文件都提供了一个访问路径,可以直接访问到该文件

      • 在aliyun中存储文件;

    第三方服务的通用思路:

    1. 准备工作

    2. 参照官方SDk编写入门程序

    3. 集成使用

    注意 :

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

    阿里云OSS - 使用步骤

    1. 注册阿里云(实名认证)

    2. 充值

    3. 开通对象存储服务(OSS):

      • 点击右上角的控制台。

      • 将鼠标移至左上角三条横线处,在显示界面中单击对象存储OSS。

      • 然后点击开通

    4. 创建bucket : 直接点击左上角的新建Bucket,然后其它不用改,取一个唯一的name,然后将读写权限改为公共读。

    5. 获取AccessKey : 注意保存AccessKey和Secret

    6. 参照官方SDk编写入门程序 : 点击右下角的SDk下载,然后在新出现的页面中点击SDk示例,参考官方文档照做即可,如java : copy相关语言文件上传的代码即可,如下 :

      1. import org.junit.jupiter.api.Test;
      2. import com.aliyun.oss.ClientException;
      3. import com.aliyun.oss.OSS;
      4. import com.aliyun.oss.OSSClientBuilder;
      5. import com.aliyun.oss.OSSException;
      6. import java.io.FileInputStream;
      7. import java.io.InputStream;
      8. public class AliOssTest {
      9.   @Test
      10.   public void testOss(){
      11.       // Endpoint以华东1(杭州)为例,其它Region请按实际情况填写。
      12.       String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
      13.       // 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
      14.       String accessKeyId = "---------------------";
      15.       String accessKeySecret = "-----------------------";
      16.       // 填写Bucket名称,例如examplebucket。
      17.       String bucketName = "-----------";
      18.       // 填写Object完整路径,完整路径中不能包含Bucket名称,例如exampledir/exampleobject.txt。
      19.       String objectName = "0001.jpg";
      20.       // 填写本地文件的完整路径,例如D:\\localpath\\examplefile.txt。
      21.       // 如果未指定本地路径,则默认从示例程序所属项目对应本地路径中上传文件流。
      22.       String filePath= "C:\\Users\\Administrator\\Pictures\\Saved Pictures\\10.jpg";
      23.       // 创建OSSClient实例。
      24.       OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
      25.       try {
      26.           InputStream inputStream = new FileInputStream(filePath);
      27.           // 创建PutObject请求。
      28.           ossClient.putObject(bucketName, objectName, inputStream);
      29.       } catch (OSSException oe) {
      30.           System.out.println("Caught an OSSException, which means your request made it to OSS, "
      31.                   + "but was rejected with an error response for some reason.");
      32.           System.out.println("Error Message:" + oe.getErrorMessage());
      33.           System.out.println("Error Code:" + oe.getErrorCode());
      34.           System.out.println("Request ID:" + oe.getRequestId());
      35.           System.out.println("Host ID:" + oe.getHostId());
      36.       } catch (Exception ce) {
      37.           System.out.println("Caught an ClientException, which means the client encountered "
      38.                   + "a serious internal problem while trying to communicate with OSS, "
      39.                   + "such as not being able to access the network.");
      40.           System.out.println("Error Message:" + ce.getMessage());
      41.       } finally {
      42.           if (ossClient != null) {
      43.               ossClient.shutdown();
      44.           }
      45.       }
      46.   }
      47. }

      如果jdk在9以上,除了添加

      1.  com.aliyun.oss
      2.            aliyun-sdk-oss
      3.            3.15.1
      4.        

      还要添加 :

      1. javax.xml.bind
      2. jaxb-api
      3. 2.3.1
      4. javax.activation
      5. activation
      6. 1.1.1
      7. org.glassfish.jaxb
      8. jaxb-runtime
      9. 2.3.3

    7. 然后在相关代码中更改自己的相关信息(如 : endpoint , accessKeyId,accessKeySecret等);

      最后运行程序,就可以在自己的Bucket中查看到上传的文件了;

    8. 案例集成OSS :

      如在新增员工的过程中,要上传图片,那么服务器端先接收上传的图片,然后通过程序将图片用OSS来存储,然后获取OSS中存储好的文件的URl,最后返回URl给前端,然后前端自动将图片展示出来。

    注意 :

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

    具体 :

    创建一个工具类 AliOSSUtils(将相关信息更改为自己的):

    1. package com.it.utils;
    2. import com.aliyun.oss.OSS;
    3. import com.aliyun.oss.OSSClientBuilder;
    4. import org.springframework.stereotype.Component;
    5. import org.springframework.web.multipart.MultipartFile;
    6. import java.io.*;
    7. import java.util.UUID;
    8. @Component
    9. public class AliOSSUtils{
    10.    private String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
    11.    private String accessKeyId = "xxxxxxx";
    12.    private String accessKeySecret = "xxxxxx";
    13.    private String bucketName = "xxxxxxxxxx";
    14.    /**
    15.     * 实现上传图片到OSS
    16.     */
    17.    public String upload(MultipartFile file) throws IOException {
    18.        // 获取上传的文件的输入流
    19.        InputStream inputStream = file.getInputStream();
    20.        // 避免文件覆盖
    21.        String originalFilename = file.getOriginalFilename();
    22.        String fileName = UUID.randomUUID().toString() + originalFilename.substring(originalFilename.lastIndexOf("."));
    23.        //上传文件到 OSS
    24.        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
    25.        ossClient.putObject(bucketName, fileName, inputStream);
    26.        //文件访问路径
    27.        String url = endpoint.split("//")[0] + "//" + bucketName + "." + endpoint.split("//")[1] + "/" + fileName;
    28.        // 关闭ossClient
    29.        ossClient.shutdown();
    30.        return url;// 把上传到oss的路径返回
    31.   }
    32. }

    然后在该接口中直接调用工具类中的方法即可 :

    1. @PostMapping("/upload")
    2.       public Result upload(MultipartFile image) throws IOException {
    3.           log.info("文件上传,文件名 : {}",image.getOriginalFilename());
    4.           // 调用阿里云OSS工具类进行文件上传
    5.           String url = aliOSSUtils.upload(image);
    6.           log.info("文件上传完成,文件访问的url为 : {}",url);
    7.           return Result.success(url);
    8.       }

  • 相关阅读:
    【scikit-learn基础】--『监督学习』之 谱聚类
    2024 年 2 月公链行业研报
    皕杰报表之性能管理
    计算机毕业设计Java珠宝首饰进销存管理系统(源码+系统+mysql数据库+Lw文档)
    南大通用GBase8s 常用SQL语句(286)
    Linux内核4.14版本——drm框架分析(12)——DRM_IOCTL_MODE_SETCRTC(drm_mode_setcrtc)
    使用WebDriver采样器将JMeter与Selenium集成
    单调队列与应用
    使用dasviewer加载osgb模型,不显示纹理,黑乎乎的怎么解决?
    18. 注入 Servlet、Filter、Listener
  • 原文地址:https://blog.csdn.net/ros275229/article/details/134219113