java对接七牛云实现文件上传(详细版)

一起探讨学习

欢迎大家进群,一起讨论学习

每天给大家提供技术干货

在这里插入图片描述

博主技术笔记 https://notes.xiyankt.com


博主开源微服架构前后端分离技术博客项目源码地址,欢迎各位star https://gitee.com/bright-boy/xiyan-blog


java对接七牛云上传(详细版)

1.获取七牛云密钥 (我这里有多个存储空间)

在这里插入图片描述
在这里插入图片描述

2.yml配置

#  七牛秘钥
oss:
  qiniu:
     accessKey: *********************
     secretKey: *********************
     #图片名字
     bucketPictureName: sunset-pictures
     #图片外部访问拦截
     domainPicture: http://qiniu-picture.xiyanyuanma.com/
     #文件名字
     bucketFileName: sunset-file
     #文件外部访问拦截
     domainFile: http://qiniu-file.xiyanyuanma.com/

3.maven依赖

<!-- https://mvnrepository.com/artifact/com.qiniu/qiniu-java-sdk -->
        <dependency>
            <groupId>com.qiniu</groupId>
            <artifactId>qiniu-java-sdk</artifactId>
            <version>7.4.0</version>
        </dependency>
        <dependency>
            <groupId>com.google.code.gson</groupId>
            <artifactId>gson</artifactId>
            <version>2.8.6</version>
        </dependency>

4.InitConfig

package com.xiyan.config;

import com.xiyan.constants.Constant;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;


/**
 * 加载配置
 *
 * @author bright
 */
@Component
@ConfigurationProperties(prefix = "oss.qiniu")
@Data
@RefreshScope
public class InitConfig {
    /**
     * AccessKey
     */
    private String accessKey;
    /**
     * SecretKey
     */
    private String secretKey;
    /**
     * 图片存储空间名
     */
    private String bucketPictureName;
    /**
     * 图片外链
     */
    private String domainPicture;
    /**
     * 文件存储空间名
     */
    private String bucketFileName;
    /**
     * 文件外链
     */
    private String domainFile;

    @Bean
    public void init() {
        Constant.accessKey = this.accessKey;
        Constant.secretKey = this.secretKey;
        Constant.bucketPictureName = this.bucketPictureName;
        Constant.domainPicture = this.domainPicture;
        Constant.bucketFileName = this.bucketFileName;
        Constant.domainFile = this.domainFile;
    }
}

Constant类

package com.xiyan.constants;


/**
 * Description: 常量类
 *
 * @version 1.0:
 * @author: bright
 * @date:Created in 2020/7/3
 */
public class Constant {
    public static final String IMAGE = "image";

    public static final String FILE = "file";

    /**
     * AccessKey
     */
    public static String accessKey;
    /**
     * SecretKey
     */
    public static String secretKey;
    /**
     * 图片存储空间名
     */
    public static String bucketPictureName;
    /**
     * 图片外链
     */
    public static String domainPicture;
    /**
     * 文件存储空间名
     */
    public static String bucketFileName;
    /**
     * 文件外链
     */
    public static String domainFile;
}

QiNiuUtil

package com.xiyan.util;

import com.google.gson.Gson;
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;
import com.xiyan.constants.Constant;

import java.io.FileInputStream;

/**
 * Description:
 *
 * @author: bright
 * @date:Created in 2020/12/3 17:39
 */
public class QiNiuUtil {

    /**
     * 将图片上传到七牛云
     */
    public String upload(FileInputStream file, String fileType) throws Exception {
        // zone0华东区域,zone1是华北区域,zone2是华南区域
        Configuration cfg = new Configuration(Region.region0());
        UploadManager uploadManager = new UploadManager(cfg);
        // 生成上传凭证,然后准备上传
        Auth auth = Auth.create(Constant.accessKey, Constant.secretKey);
        String upToken = null;
        String path = null;
        if (fileType.equals(Constant.IMAGE)) {
            upToken = auth.uploadToken(Constant.bucketPictureName);
            path = Constant.domainPicture;
        } else if (fileType.equals(Constant.FILE)) {
            upToken = auth.uploadToken(Constant.bucketFileName);
            path = Constant.domainFile;
        }
        Response response = uploadManager.put(file, null, upToken, null, null);
        // 解析上传成功的结果
        DefaultPutRet putRet = new Gson().fromJson(response.bodyString(), DefaultPutRet.class);
        return path + putRet.key;
    }
}

UploadService

package com.xiyan.service;

import com.xiyan.vo.BaseVO;
import org.springframework.web.multipart.MultipartFile;

/**
 * Description:
 *
 * @author: bright
 * @date:Created in 2020/12/3 17:02
 */
public interface UploadService {
    /**
     * 文件上传
     *
     * @param file
     * @param fileType
     * @return
     * @throws Exception
     */
    BaseVO upload(MultipartFile file, String fileType) throws Exception;
}

UploadServiceImpl

package com.xiyan.service.impl;

import com.xiyan.constants.Constant;
import com.xiyan.enumeration.ErrorCodeEnum;
import com.xiyan.service.UploadService;
import com.xiyan.util.QiNiuUtil;
import com.xiyan.vo.BaseVO;
import com.xiyan.vo.FileVO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.io.FileInputStream;

/**
 * Description:
 *
 * @author: bright
 * @date:Created in 2020/12/3 17:05
 */
@Service
@Slf4j
public class UploadServiceImpl implements UploadService {
    @Override
    public BaseVO upload(MultipartFile file, String fileType) throws Exception {
        String fileName = file.getOriginalFilename();
        if (fileName == null) {
            log.error("传入的文件名不能为空");
            return new BaseVO(false, ErrorCodeEnum.E0804.getKey(), ErrorCodeEnum.E0804.getValue());
        }
        if (!this.validateFileName(fileName)) {
            log.error("文件名应仅包含汉字、字母、数字、下划线和点号");
            return new BaseVO(false, ErrorCodeEnum.E0805.getKey(), ErrorCodeEnum.E0805.getValue());
        }
        FileInputStream fileInputStream = (FileInputStream) file.getInputStream();
        String url = "";
        if (fileType.equals(Constant.IMAGE)) {
            url = new QiNiuUtil().upload(fileInputStream, Constant.IMAGE);
        } else if (fileType.equals(Constant.FILE)) {
            url = new QiNiuUtil().upload(fileInputStream, Constant.FILE);
        }
        FileVO fileVO = new FileVO();
        fileVO.setDownloadUrl(url);
        return fileVO;
    }

    /**
     * 验证文件名称:仅包含 汉字、字母、数字、下划线和点号
     *
     * @param fileName 文件名称
     * @return 返回true表示符合要求
     */
    private boolean validateFileName(String fileName) {
        String regex = "^[a-zA-Z0-9_\\u4e00-\\u9fa5_\\.]+$";
        return fileName.matches(regex);
    }
}

UploadController

package com.xiyan.controller;

import com.xiyan.constants.Constant;
import com.xiyan.service.UploadService;
import com.xiyan.vo.BaseVO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import javax.annotation.Resource;

/**
 * Description:
 *
 * @author: bright
 * @date:Created in 2020/12/3 17:14
 */
@Api(tags = "文件集合")
@RestController
public class UploadController {
    @Resource
    private UploadService uploadService;

    @ApiOperation(value = "上传文件接口")
    @PostMapping(value = "/file/upload")
    public BaseVO fileUpload(MultipartFile file) throws Exception {
        return uploadService.upload(file, Constant.FILE);
    }

    @ApiOperation(value = "上传图片接口")
    @PostMapping(value = "/image/upload")
    public BaseVO ImageUpload(MultipartFile file) throws Exception {
        return uploadService.upload(file, Constant.IMAGE);
    }
}

BaseVO

package com.xiyan.vo;

import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.io.Serializable;

/**
 * @author bright
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
public class BaseVO implements Serializable {

    private static final long serialVersionUID = 1L;

    @ApiModelProperty(value = "结果码")
    private Boolean success = true;

    @ApiModelProperty(value = "错误码")
    private String errorCode;

    @ApiModelProperty(value = "错误信息")
    private String errorMsg;
}

FileVO

package com.xiyan.vo;

import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

/**
 * Description:
 *
 * @author: bright
 * @date:Created in 2020/11/16 13:57
 */
@Data
public class FileVO extends BaseVO {
    private static final long serialVersionUID = 1L;

    @ApiModelProperty(value = "文件路径")
    private String downloadUrl;
}

测试

在这里插入图片描述
在这里插入图片描述

注意上传大文件nginx需要做如下配置

找到自己主机的nginx.conf配置文件,打开
在http{}中加入
    #客户端文件上传的大小
    client_max_body_size 500m;
    #用于tomcat反向代理,解决nginx 504错误 
    proxy_connect_timeout 300; #单位秒 
    proxy_send_timeout 300; #单位秒 
    proxy_read_timeout 300; #单位秒 
    proxy_buffer_size 16k; 
    proxy_buffers 4 64k; 
    proxy_busy_buffers_size 128k; 
    proxy_temp_file_write_size 128k;
    # ps:以timeout结尾配置项时间要配置大点
然后重启nginx
好的,我可以为您提供一些指导。 首先,您需要注册七牛云账户并创建一个存储空间。接着,您需要下载并添加七牛云Java SDK到您的项目中。 在您的Java代码中,您需要先进行身份验证并获取七牛云的上传凭证。您可以使用如下代码: ```java Auth auth = Auth.create(accessKey, secretKey); String upToken = auth.uploadToken(bucket); ``` 其中,accessKey和secretKey是您在七牛云账户中创建的API密钥,bucket则是您创建的存储空间名称。 接着,您可以使用七牛云提供的UploadManager类将文件上传至云存储中。以下是一个示例代码: ```java Configuration cfg = new Configuration(Zone.zone0()); UploadManager uploadManager = new UploadManager(cfg); File file = new File("your_file_path"); String key = "your_file_key_name"; try { Response response = uploadManager.put(file, key, upToken); DefaultPutRet putRet = new Gson().fromJson(response.bodyString(), DefaultPutRet.class); System.out.println(putRet.key); System.out.println(putRet.hash); } catch (QiniuException ex) { Response r = ex.response; System.err.println(r.toString()); try { System.err.println(r.bodyString()); } catch (QiniuException ex2) { // ignore } } ``` 其中,file是您要上传的文件,key是该文件在云存储中的唯一标识符。上传成功后,您可以从DefaultPutRet对象中获取该文件的key和hash值。 以上是一个简单的七牛云文件上传Java代码示例,希望对您有所帮助。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

刘明同学呀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值