← 返回首页
Springboot实现七牛云图片上传
发表时间:2023-02-16 16:42:43
Springboot实现七牛云图片上传

Springboot实现七牛云图片上传。

1.为什么选择七牛云?

七牛云提供了免费使用云存储的功能:普通用户每月可以免费使用10GB的存储空间、每月免费下载的流量达到10GB、每月免费PUT/DELETE 10万次请求以及每月免费GET 100万次请求。对于普通的网站,完全够我们使用。

2.Springboot实现七牛云上传接口

pom.xml引入依赖。

<!--七牛云上传图片服务-->
<!-- https://mvnrepository.com/artifact/com.qiniu/qiniu-java-sdk -->
<dependency>
   <groupId>com.qiniu</groupId>
   <artifactId>qiniu-java-sdk</artifactId>
   <version>7.2.7</version>
</dependency>

在application.yml中添加七牛云用户配置

#七牛云的配置
qiniu:
  access_key: xxxxxxxxxxxxxxxxxxxxxxxx   #七牛云的AK
  secret_key: xxxxxxxxxxxxxxxx           #七牛云的SK
  bucket_name: test-01                   #七牛云的BucketName
  domain_name: http://rterwfsdfew-bkt.clouddn.com/   #七牛云提供的免费域名

文件上传服务层实现。

QiniuService.java

public interface QiniuService {
    public String saveImage(MultipartFile file) throws IOException;
}

QiniuServiceImpl.java

@Service
public class QiniuServiceImpl implements QiniuService {

    private static final Logger logger = LoggerFactory.getLogger(QiniuService.class);

    @Value("${qiniu.access_key}")
    // 设置好账号的ACCESS_KEY和SECRET_KEY
    private String ACCESS_KEY="";
    @Value("${qiniu.secret_key}")
    private String SECRET_KEY="";
    // 要上传的空间
    @Value("${qiniu.bucket_name}")
    private String bucketname="";

    // 测试域名,只有30天有效期
    @Value("${qiniu.domain_name}")
    private String QINIU_IMAGE_DOMAIN;

    // 密钥配置
    Auth auth ;
    // 构造一个带指定Zone对象的配置类,不同的七云牛存储区域调用不同的zone
    Configuration cfg;
    // ...其他参数参考类注释
    UploadManager uploadManager;

    @PostConstruct
    public void init() {
        auth = Auth.create(ACCESS_KEY, SECRET_KEY);
        cfg = new Configuration(Zone.huanan());
        uploadManager = new UploadManager(cfg);
    }

    // 简单上传,使用默认策略,只需要设置上传的空间名就可以了
    public String getUpToken() {
        return auth.uploadToken(bucketname);
    }

    public String saveImage(MultipartFile file) throws IOException {
        try {
            int dotPos = file.getOriginalFilename().lastIndexOf(".");
            if (dotPos < 0) {
                return null;
            }
            String fileExt = file.getOriginalFilename().substring(dotPos + 1).toLowerCase();
            // 判断是否是合法的文件后缀
            if (!FileUtil.isFileAllowed(fileExt)) {
                return null;
            }

            String fileName = UUID.randomUUID().toString().replaceAll("-", "") + "." + fileExt;
            // 调用put方法上传
            Response res = uploadManager.put(file.getBytes(), fileName, getUpToken());
            // 打印返回的信息
            if (res.isOK() && res.isJson()) {
                // 返回这张存储照片的地址
                return QINIU_IMAGE_DOMAIN + JSONObject.parseObject(res.bodyString()).get("key");
            } else {
                logger.error("七牛异常:" + res.bodyString());
                return null;
            }
        } catch (QiniuException e) {
            // 请求失败时打印的异常的信息
            logger.error("七牛异常:" + e.getMessage());
            return null;
        }
    }
}

FileUtil.java

public class FileUtil {

    // 图片允许的后缀扩展名
    public static String[] IMAGE_FILE_EXTD = new String[]{"png", "bmp", "jpg", "jpeg", "pdf"};

    public static boolean isFileAllowed(String fileName) {
        for (String ext : IMAGE_FILE_EXTD) {
            if (ext.equals(fileName)) {
                return true;
            }
        }
        return false;
    }
}

实现接口。


@RestController
@RequestMapping("qiniu")
public class QiniuController {

    @Autowired
    private QiniuService qiniuService;

    @PostMapping(value = "/upload")
    public R uploadImage(@RequestParam("file") MultipartFile file, HttpServletRequest request) {

        if (file.isEmpty()) {
            return R.fail("上传出现错误!");
        }
        try {
            String fileUrl = qiniuService.saveImage(file);
            return R.success("文件上传成功!", fileUrl);
        } catch (Exception e) {
            e.printStackTrace();
            return R.error("程序出现异常!");
        }
    }
}

3.前端测试页面

前端使用jQuery.ajax调用上传接口。

<form>
  <input class="form-control" style="width: 400px" name="logo" type="file"
  id="formFile"/>
  <input type="hidden" name="logo" id="movie-logo" value=""/>
  <input type="button" style="width: 80px;margin-left: 20px" onclick="doUpload()"
  class="btn app-btn-secondary" value="上传"/>
</form>

...

<script>
   function doUpload() {
        let fd = new FormData();
        fd.append("file", document.getElementById("formFile").files[0]);
        $.ajax({
            url: "http://192.168.6.21:8080/freemoviedemo/qiniu/upload",
            type: "POST",
            data: fd,
            //注意:以下两个参数contentType和processData都必须设置为false;
            contentType : false,
            processData : false,
            dataType: "json",
            success: function (res) {
                console.log(res);
                if (res.code === 200) {
                    console.log("上传成功后的图片URL地址");
                    console.log(res.data);
                    //newMovie.logo = res.data;
                    $("#movie-logo").val(res.data);
                    $("#exampleModal").modal("show"); //显示模态窗口
                    $("#my-model-title").text("上传图片成功!");
                } else {
                    console.log(res.msg);
                }
            },
            error: err => {
                console.log(err);
            }
        })
    }

</script>

前端上传成功后,会返回图片的URL地址。