springboot项目(oss/本地)实现文件上传

方式一:oss实现文件上传:

1.导入对应的maven坐标

            <dependency>
                <groupId>com.aliyun</groupId>
                <artifactId>aliyun-java-sdk-core</artifactId>
                <version>4.3.3</version>
            </dependency>
            <dependency>
                <groupId>com.aliyun.oss</groupId>
                <artifactId>aliyun-sdk-oss</artifactId>
                <version>3.1.0</version>
            </dependency>

2. 配置文件

#服务名
spring:
  application:
    name: service-oss

  #环境设置
  profiles:
    active: dev

server:
  port: 8002


#阿里云OSS
aliyun:
  oss:
    file:
      #不同的服务器,地址不同
      endpoint: oss-cn-chengdu.aliyuncs.com
      keyid: //注册阿里云oss功能获取
      keysecret: //注册阿里云oss功能获取
      #bucket:可以在控制台创建,也可以使用java代码创建
      bucketname: edu-425

 3.读取配置文件配置信息

package com.atguigu.oss.utils;

import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

/**
 * @Author panghl
 * @Date 2020/12/31 21:36
 * @Description 读取配置文件,常量类
 **/
//当项目一启动,spring接口,spring加载之后,执行接口一个方法
@Component
public class ConstantPropertiesUtils implements InitializingBean {

    //读取配置文件的内容

    @Value("${aliyun.oss.file.endpoint}")
    private String endpoint;

    @Value("${aliyun.oss.file.keyid}")
    private String keyId;

    @Value("${aliyun.oss.file.keysecret}")
    private String keySecret;

    @Value("${aliyun.oss.file.bucketname}")
    private String bucketName;

    //定义公开静态常量

    public static String END_POIND;
    public static String KEY_ID;
    public static String KEY_SECRET;
    public static String BUCKET_NAME;

    @Override
    public void afterPropertiesSet() throws Exception {
        END_POIND = endpoint;
        KEY_ID = keyId;
        KEY_SECRET = keySecret;
        BUCKET_NAME = bucketName;
    }

}

 4.controller

package com.atguigu.oss.controller;
import com.atguigu.common.R;
import com.atguigu.oss.service.OssService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;

/**
 * @Author panghl
 * @Date 2020/12/31 21:50
 * @Description TODO
 **/
@RestController
@RequestMapping("/eduoss/fileoss")
@CrossOrigin
public class OssController {

    @Autowired
    private OssService ossService;


    //上传头像的方法
    @PostMapping
    public R uploadOssFile(MultipartFile file){
        //获取上传文件
        //返回上传到oss的路径
        String url = null;
        System.out.println(file);
        try {
            url = ossService.uploadFileAvatar(file);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return R.ok().data("url",url);
    }


/*    private File getFile(String id, HttpServletResponse response){
        EduTeacher eduTeacher = teacherService.get(id);
        //点击下载链接更新下载次数
//        Integer count= attach.getViewCount();
//        count=count==null?0:count;
//        count+=1;
//        attach.setViewCount(count);
//        attachService.updateById(attach);

*//*        File file = getFile(id, response);
        //获取文件输入流
        FileInputStream is = new FileInputStream(file);
        response.setContentType("application/octet-stream");
        //获取响应输出流
        ServletOutputStream os = response.getOutputStream();
        //文件拷贝
        IOUtils.copy(is, os);
        IOUtils.closeQuietly(is);
        try{
            if(is!=null){
                is.close();
            }
            if(os!=null){
                os.close();
            }
        }catch (Exception ex){
            ex.printStackTrace();
        }*//*
        File file=new File(eduTeacher.getAvatar());
        return file;
    }*/

}

5.service层

package com.atguigu.oss.service;

import org.springframework.web.multipart.MultipartFile;

import java.io.FileNotFoundException;
import java.io.IOException;

/**
 * @Author panghl
 * @Date 2020/12/31 21:50
 * @Description OSS服务接口
 **/
public interface OssService {

    /**
     * 上传头像
     * @param file
     * @return
     */
    String uploadFileAvatar(MultipartFile file) throws IOException;
}
package com.atguigu.oss.service.impl;

import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.model.GetObjectRequest;
import com.atguigu.common.uuid.IdUtils;
import com.atguigu.oss.service.OssService;
import com.atguigu.oss.utils.ConstantPropertiesUtils;
import org.joda.time.DateTime;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.io.*;

/**
 * @Author panghl
 * @Date 2020/12/31 21:50
 * @Description TODO
 **/
@Service
public class OssServiceImpl implements OssService {
    @Override
    public String uploadFileAvatar(MultipartFile file) {
        //工具类获取值
         String endpoint = ConstantPropertiesUtils.END_POIND;
         String accessKeyId = ConstantPropertiesUtils.KEY_ID;
         String accessKeySecret = ConstantPropertiesUtils.KEY_SECRET;
         String bucketName = ConstantPropertiesUtils.BUCKET_NAME;
        try {
            // 创建OSSClient实例。
            OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);

            // 获取上传文件输入流
            InputStream inputStream = file.getInputStream();
            //获取文件名称
            String filename = file.getOriginalFilename();

            //1.在文件名称里面添加随机唯一的值
            //filename = IdUtils.fastSimpleUUID() + filename;
            //2.把文件按照日期进行分类
            // 2019/11/12/01.jpg  获取当前日期
            //String datePath = new DateTime().toString("yyyy/MM/dd");
            filename = new DateTime().toString("yyyy/MM/dd") + "/" + IdUtils.fastSimpleUUID() + filename;

            //调用oss方法实现上传
            //第一个参数 Bucket名称
            //第二个参数 上传到oss文件路径和文件名称 /aa/bb/1.jpg
            //第三个参数 上传文件输入流
            // https://edu-425.oss-cn-chengdu.aliyuncs.com/testdlrb.jpg
            ossClient.putObject(bucketName, filename, inputStream);
            // 关闭OSSClient。
            ossClient.shutdown();
            //把上传之后文件路径返回
            //需要把上传到阿里云oss路径手动拼接出来
            return "https://" + bucketName + "." + endpoint + "/" + filename;
        } catch (IOException e) {
            e.printStackTrace();
            return null;
        }
    }


}

 此时就已经可以实现文件的上传了!

这种实现方式需要在阿里云的对象存储 OSS开通服务!创建对应的Bucket仓库,通过AccessKey获取阿里云API的密钥

方式二:本地实现多文件上传:

1.配置配置信息

server:
  port: 8003

edu:
  file:
    path: D:/file/

2.编写多文件对象

package com.atguigu.ftp.vo;

import com.fasterxml.jackson.annotation.JsonIgnore;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import org.springframework.web.multipart.MultipartFile;

/**
 * @Author panghl
 * @Date 2021/1/8 16:11
 * @Description TODO
 **/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@ApiModel(value="多文件对象")
public class MultipartFilesBaseVO {

    @ApiModelProperty(value = "附件列表",dataType = "MultipartFile")
    @JsonIgnore
    private MultipartFile[] files;
}

3.controller

package com.atguigu.ftp.controller;

import com.atguigu.common.R;
import com.atguigu.ftp.service.FileService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

/**
 * @Author panghl
 * @Date 2021/1/6 10:32
 * @Description TODO
 **/
@Api(tags = {"文件管理"})
@RestController
@RequestMapping("/edufile/local")
public class FileController {

    @Autowired
    private FileService fileService;

    @ApiOperation(value = "單個文件上传")
    @PostMapping(value = "/upload-file")
    public R uploadFile(@RequestParam(value="file",required = true) MultipartFile file){
        String url = fileService.uploadFile(file);
        return R.ok().data("url",url);
    }

    @ApiOperation(value = "多文件MultipartFile上传")
//    @ApiImplicitParams({@ApiImplicitParam(name = "file[]", value = "文件流对象,接收数组格式", required = true,paramType = "form",dataType = "file",allowMultiple = true)})
    @ApiImplicitParams({@ApiImplicitParam(name = "file[]", value = "文件流对象,接收数组格式", required = true,dataType = "MultipartFile",allowMultiple = true)})
    @PostMapping(value = "/upload-files")
    public R uploadFile(@RequestParam(value="file[]",required = true) MultipartFile[] files){
        List<String> urls = new ArrayList<>();
        try {
            urls = fileService.uploadFiles(files);
        }catch (Exception e){
            e.printStackTrace();
        }
        return R.ok().data("urls",urls);
    }

}

4.service层

package com.atguigu.ftp.service;

import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.util.List;

/**
 * @Author panghl
 * @Date 2021/1/6 10:33
 * @Version 1.0
 * @Description TODO
 **/

public interface FileService {

    List<String> uploadFiles(MultipartFile[] files);

    String uploadFile(MultipartFile file);
}
package com.atguigu.ftp.service.impl;

import com.atguigu.ftp.service.FileService;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;

/**
 * @Author panghl
 * @Date 2021/1/6 10:33
 * @Description TODO
 **/
@Service
public class FileServiceImpl implements FileService {

    @Value("${edu.file.path}")
    private String fileRootPath;

    @Override
    public List<String> uploadFiles(MultipartFile[] files) {
        List<String> urls = new ArrayList<>();
        int index = 0;
        String filePath = "";
        for (MultipartFile file : files) {
            index += 1;
            // 上传简单文件名
            String originalFilename = file.getOriginalFilename();
            String suffix = "";
            if (originalFilename.lastIndexOf(".") >= 0) {
                suffix = originalFilename.substring(originalFilename.lastIndexOf("."));
            }
            // 存储路径
            filePath = new StringBuilder(fileRootPath).append(System.currentTimeMillis() + "-" + index + "-" + UUID.randomUUID()).append(suffix).toString();
            try {
                // 保存文件
                file.transferTo(new File(filePath));
                urls.add(filePath);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return urls;
    }

    @Override
    public String uploadFile(MultipartFile file) {
        String filePath = "";
        int index = 0;
        // 上传简单文件名
        String originalFilename = file.getOriginalFilename();
        String suffix = "";
        if (originalFilename.lastIndexOf(".") >= 0) {
            suffix = originalFilename.substring(originalFilename.lastIndexOf("."));
        }
        // 存储路径
        filePath = new StringBuilder(fileRootPath).append(System.currentTimeMillis() + "-" + index + "-" + UUID.randomUUID()).append(suffix).toString();
        try {
            // 保存文件
            file.transferTo(new File(filePath));
        } catch (IOException e) {
            e.printStackTrace();
        }
        return filePath;
    }
}

5.使用swagger进行测试! 

注意的是swagger的jar包是否冲突:

<dependency>
                <groupId>io.springfox</groupId>
                <artifactId>springfox-swagger2</artifactId>
                <version>${swagger.version}</version>
                <exclusions>
                    <exclusion>
                        <groupId>io.swagger</groupId>
                        <artifactId>swagger-models</artifactId>
                    </exclusion>
                </exclusions>
            </dependency>
            <dependency>
                <groupId>io.swagger</groupId>
                <artifactId>swagger-models</artifactId>
                <version>1.5.22</version>
            </dependency>
            <!--swagger ui-->
            <dependency>
                <groupId>io.springfox</groupId>
                <artifactId>springfox-swagger-ui</artifactId>
                <version>${swagger.version}</version>
            </dependency>

            <!--swagger增强-->
            <dependency>
                <groupId>com.github.xiaoymin</groupId>
                <artifactId>knife4j-spring-boot-starter</artifactId>
                <version>2.0.2</version>
                <exclusions>
                    <exclusion>
                        <groupId>io.swagger</groupId>
                        <artifactId>swagger-models</artifactId>
                    </exclusion>
                </exclusions>
            </dependency>

猜你喜欢

转载自blog.csdn.net/qq_45441466/article/details/113086434
今日推荐