前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >十.Springboot实现用户文件的上传

十.Springboot实现用户文件的上传

作者头像
用户8988577
发布2022-12-27 15:59:13
7220
发布2022-12-27 15:59:13
举报
文章被收录于专栏:言云纪言云纪

前言

文件的上传采用的是MultipartFile工具类进行获取的,最后将流保存为临时文件以异步的形式保存到腾讯云cos服务! ps:(本期只贴出关于文件上传块的代码,数据持久层代码将不展示!无外呼增删改查,没啥特别的操作!)

对象存储工具类(cos)

pom依赖引入

代码语言:javascript
复制
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <optional>true</optional>
        </dependency>
        <!--腾讯云-->
        <dependency>
            <groupId>com.qcloud</groupId>
            <artifactId>cos_api</artifactId>
            <version>5.6.24</version>
        </dependency>

编写yam文件

代码语言:javascript
复制
cos:
  #存储桶访问域名
  baseUrl: https://xxxxxxxxxxxxxxxxxxx.com
  accessKey: AKxxxxxxxxxxxxxxxxxxxpUu4ze4
  secretKey: FF0xxxxxxxxxxxxx90
  #存储桶地区
  regionName: ap-shanghai
  #存储桶名字
  bucketName: oxxxx-xxxxxxx0
  #上传文件前缀路径(eg:/images/)
  folderPrefix: /images

实体类

代码语言:javascript
复制
@Data
@Component
// 自动注入yam
@ConfigurationProperties(prefix = "cos")
public class COSConfig {
    private String baseUrl;
    private String accessKey;
    private String secretKey;
    private String regionName;
    private String bucketName;
    private String folderPrefix;
}

工具类

代码语言:javascript
复制
public class CosUtils {
    public static COSClient newCosClient(COSConfig cosConfig){
        // 初始化用户身份信息(secretId, secretKey)
        COSCredentials cred = new BasicCOSCredentials(cosConfig.getAccessKey(),cosConfig.getSecretKey());
        // 设置bucket的区域, COS地域的简称请参照 https://www.qcloud.com/document/product/436/6224
        ClientConfig clientConfig = new ClientConfig(new Region(cosConfig.getRegionName()));
        // 生成cos客户端
        return new COSClient(cred, clientConfig);
    }
}
代码语言:javascript
复制
public class FileUtils {
    /**
     * @Description 创建临时文件
     * @Return filepath
     * @Date 2022/10/7 3:13
     */
    public static File transferToFile(MultipartFile multipartFile) throws IOException {
        String originalFilename = multipartFile.getOriginalFilename();
        String prefix = originalFilename.split("\\.")[0];
        String suffix = originalFilename.substring(originalFilename.lastIndexOf("."));
        File file = File.createTempFile(prefix, suffix);
        multipartFile.transferTo(file);
        return file;
    }
    /**
     * @Description 保留后缀创建新名字,uuid+后缀
     * @Param null
     * @Return {@link null}
     * @Author Ocean_IT
     * @Email 14312400@qq.com
     * @Date 2022/10/7 3:31
     */

    public static String get_new_filename(MultipartFile file){
        String[] strs = file.getOriginalFilename().split("\\.");
        String Suffix =strs[strs.length-1];
        String name = IdUtil.simpleUUID()+"."+ Suffix;
        String folderName = DateUtil.today()+"/"+ Suffix;
        String key = folderName +"/"+ name;
        return key;
    }

}

程序核心逻辑编写

服务层

VideoServiceImpl

代码语言:javascript
复制
    /*
     * @Description 上传视频
     * @Param null
     * @Return {@link null}
     * @Author Ocean_IT
     * @Email 14312400@qq.com
     * @Date 2022/10/6 23:32
     */
     @Autowired
    private UploadVideoService uploadVideoService;
    @Autowired
    private CreateRoomDao createRoomDao;
    @Transactional
    public BaseResponse post_video(MultipartFile file, String token) throws Exception {
        String title = file.getOriginalFilename();
        if(title.length()>20){
            title = title.substring(0,15)+"...";
        }
        Assert.isTrue(userDao.get_uploadVideo_num(TokenUtils.getOpenid(token)),"你上传视频的已达到上限!");
        Long vid = IdWorker.getId();

        String key = FileUtils.get_new_filename(file);
        File localFile = FileUtils.transferToFile(file);

        Video video = Video.builder().vid(vid).vUrl(cosConfig.getBaseUrl()+"/"+key).vTitle(title).build();
        Assert.isTrue(videoDao.post_video(video),"出现未知错误,视频保存失败。请联系管理员解决!");
        UploadVideo uploadVideo = UploadVideo.builder().openid(TokenUtils.getOpenid(token)).vid(vid).uvId(IdWorker.getId()).build();
        Assert.isTrue(uploadVideoDao.post_uploadVideo(uploadVideo),"上传记录更新失败,请联系管理员解决!");
        Map<String, Object> map=new HashMap<String,Object>();
        map.put("uploadVideo",uploadVideo);
        map.put("video",video);
        uploadVideoService.UploadToCOS(key,localFile,cosConfig);
        Assert.isTrue(userDao.put_uploadVideo_num(TokenUtils.getOpenid(token),false),"数据库表修改失败,请联系管理员处理!");
        return RespGenerator.success(map);
    }

VideoService

代码语言:javascript
复制
    public BaseResponse post_video(MultipartFile file, String token) throws Exception;

UploadVideoServiceImpl 异步执行,需要在启动器添加@EnableAsync

代码语言:javascript
复制
@Slf4j
@Service("asyncService")
public class UploadVideoServiceImpl implements UploadVideoService {
    @Async
    public void UploadToCOS(String key, File localPath, COSConfig cosConfig){
        try{
            PutObjectRequest putObjectRequest = new PutObjectRequest(cosConfig.getBucketName(), key, localPath);
            CosUtils.newCosClient(cosConfig).putObject(putObjectRequest);
            log.info("文件上传成功,地址:{}",cosConfig.getBaseUrl()+"/"+key);
        }catch (Exception e){
            log.error("文件上传cos失败。");
        }finally {
            localPath.delete();
        }
    }
}

UploadVideoService

代码语言:javascript
复制
public interface UploadVideoService {
    public void UploadToCOS(String key, File localPath, COSConfig cosConfig);
}

controller控制器

代码语言:javascript
复制
    @PostMapping("/video")
    @ApiOperation(value="上传视频",notes = "传入file和token")
    public BaseResponse post_video(MultipartFile file, HttpServletRequest request) throws Exception {
        return videoService.post_video(file,request.getHeader("token"));
    }
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2022-10-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 对象存储工具类(cos)
    • pom依赖引入
      • 编写yam文件
        • 实体类
          • 工具类
          • 程序核心逻辑编写
            • 服务层
            • controller控制器
            相关产品与服务
            对象存储
            对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档