对象存储服务

这里以七牛云对象存储为例,首先导入其依赖:

  1. <dependency>
  2. <groupId>com.qiniu</groupId>
  3. <artifactId>qiniu-java-sdk</artifactId>
  4. <version>7.7.0</version>
  5. </dependency>

官方操作文档:https://developer.qiniu.com/kodo/1239/java#install-by-yourself

上传

示例:

import com.google.gson.Gson;
import com.qiniu.common.QiniuException;
import com.qiniu.http.Response;
import com.qiniu.storage.Configuration;
import com.qiniu.storage.Region;
import com.qiniu.storage.UploadManager;
import com.qiniu.storage.model.DefaultPutRet;
import com.qiniu.util.Auth;
public class qiniuTest {
    final static String accessKey = "TYHMVuGpxupDATQaYERN8fPzBllC8MWuzjoGsjlE";
    final static String secretKey = "3tGcgqra7-FRnYFevt8UmFlXPG9KlMWLyEjr7TOy";
    final static String bucket = "classroomtest";
    final static String myFile="E:\\Pictures\\壁纸~二次元\\583c1806ee400ae5.jpg";
    public static void main(String[] args) {
        Auth auth=Auth.create(accessKey,secretKey);
        String upToken = auth.uploadToken(bucket);//上传凭证
        Configuration cfg=new Configuration(Region.region1());
        UploadManager uploadManager = new UploadManager(cfg);
        String key = null;//默认不指定key的情况下,以文件内容的hash值作为文件名
        try {
            Response response = uploadManager.put(myFile, key, upToken);
            DefaultPutRet putRet = new Gson().fromJson(response.bodyString(), DefaultPutRet.class);
            System.out.println(putRet.key);//不指定key,key和hash一样,都是上传文件的名称
            System.out.println(putRet.hash);
            //也可以用“JSONObject.parseObject(res.bodyString()).get("key|hash");”
            //获取key|hash
        } catch (QiniuException e) {
            Response r = e.response;
            System.err.println(r.toString());
            try {
                System.err.println(r.bodyString());
            } catch (QiniuException ex2) {
                //ignore
            }
        }
    }
}
//控制台输出:
Fvlccsj_9ShXsOgQzdbK-ygO--ZV
Fvlccsj_9ShXsOgQzdbK-ygO--ZV

image.png
如果想要上传到这个**bucket**桶中的**teacher**目录中并指定文件名为**test**,设置:**String key = "teacher/test";**


默认上传最大文件大小为**1MB**,可通过以下配置将最大值改为**20mb**

spring:
  servlet:
    multipart:
      max-file-size: 20MB

下载

EasyExcel

EasyExcel介绍

EasyExcel是阿里巴巴开源的一个excel处理框架,以使用简单、节省内存著称EasyExcel能大大减少占用内存的主要原因是在解析Excel时没有将文件数据一次性全部加载到内存中,而是从磁盘上一行行读取数据,逐个解析。

EasyExcel特点

  • Java领域解析、生成Excel比较有名的框架有Apache poijxl等。但他们都存在一个严重的问题就是非常的耗内存。如果你的系统并发量不大的话可能还行,但是一旦并发上来后一定会OOM或者JVM频繁的**full gc**
  • **EasyExcel**采用一行一行的解析模式,并将一行的解析结果以观察者的模式通知处理(AnalysisEventListener
  • EasyExcel是一个基于Java的简单、省内存的读写Excel的开源项目。在尽可能节约内存的情况下支持读写百MBExcel

    EasyExcel操作

    pom.xml

    <dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>easyexcel</artifactId>
    <version>2.1.1</version>
    </dependency>
    

创建一个Bean实体类

@Data
public class User {
    @ExcelProperty(value = "用户id",index = 0)
    /**设置表头信息
     * 列名表头是"用户id",对应第0列;
     */
    private int id;
    @ExcelProperty(value = "用户名",index = 1)
    private String name;
}

写操作

public static void main(String[] args) {
    //设置文件名称和路径;
    String filename="E:\\Pictures\\Camera Roll\\user.xlsx";
    /*①调用写操作方法*/
    //创建数据
    List<User> list = new ArrayList<User>();
    for (int i = 0; i < 10; i++) {
        User data = new User();
        data.setId(i);
        data.setName("张三"+i);
        list.add(data);
    }
    EasyExcel.write(filename,User.class)
        .sheet("写操作-用户表")//sheet名,即表格名
        .doWrite(list);
}

读操作

监听器

public class ExcelListener extends AnalysisEventListener<User> {
    //一行一行读取Excel内容,把每行内容封装到user对象中
    //从第二行开始读取(默认认为第一行是表头)
    @Override
    public void invoke(User user, AnalysisContext analysisContext) {
        //user就是读到的内容(一行一行读取)
        System.out.println(user);
    }
    //读取表头内容
    @Autowired
    public void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {
        System.out.println("表头内容:"+headMap);
    }
    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {}
}

读取操作

public static void main(String[] args) {
    //设置文件名称和路径;
    String filename="E:\\Pictures\\Camera Roll\\user.xlsx";
    //②调用读操作方法
    EasyExcel.read(filename,User.class,new ExcelListener()).sheet().doRead();
    //sheet()不写参数默认读第一个sheet
}