java实现七牛云文件或图片上传下载(代码片段)

白大锅 白大锅     2023-01-05     481

关键词:


一、准备工作

1.1.为什么选择七牛云?

免费 免费 免费 而且注册之后每个月 有免费100 万 次get请求。
10G免费空间,10G免费流量,对于搭建自己的博客网站已经绰绰有余了。

1.2.七牛云注册

注册七牛云账号

获取自己的AK,SK:

二、java操作七牛云对象存储下载

2.1.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>

2.2.上传下载具体代码

import com.qiniu.common.QiniuException;
import com.qiniu.http.Response;
import com.qiniu.storage.UploadManager;
import com.qiniu.util.Auth;
import com.qiniu.util.StringMap;
import com.squareup.okhttp.OkHttpClient;
import com.squareup.okhttp.Request;
import com.squareup.okhttp.ResponseBody;

import java.io.*;

public class QiniuUtil 

  //设置好账号的ACCESS_KEY和SECRET_KEY
  String ACCESS_KEY = ""; //这两个登录七牛 账号里面可以找到
  String SECRET_KEY = "";

  //要上传的空间
  String bucketname = ""; //对应要上传到七牛上 你的那个路径(自己建文件夹 注意设置私有)
  //上传到七牛后保存的文件名


  //密钥配置
  Auth auth = Auth.create(ACCESS_KEY, SECRET_KEY);
  //创建上传对象
  UploadManager uploadManager = new UploadManager();


  /**
   * 简单上传,使用默认策略,只需要设置上传的空间名就可以了
   *
   * @param fileName 文件上传至七牛云空间的名称
   * @return
   */
  public String getUpToken(String fileName) 
    //return auth.uploadToken(bucketname);
    //<bucket>:<key>,表示只允许用户上传指定key的文件。在这种格式下文件默认允许“修改”,已存在同名资源则会被本次覆盖。
    //如果希望只能上传指定key的文件,并且不允许修改,那么可以将下面的 insertOnly 属性值设为 1。
    //第三个参数是token的过期时间
    return auth.uploadToken(bucketname, fileName, 3600, new StringMap().put("insertOnly", 0));
  


  /**
   * 普通上传
   *
   * @param filePath 文件路径
   * @param fileName 文件上传至七牛云空间的名称
   * @throws IOException
   */
  public void upload(String filePath, String fileName) 
    try 
      //调用put方法上传
      Response res = uploadManager.put(filePath, fileName, getUpToken(fileName));
      //打印返回的信息
      System.out.println(res.bodyString());
     catch (QiniuException e) 
      Response r = e.response;
      // 请求失败时打印的异常的信息
      System.out.println(r.toString());
      try 
        //响应的文本信息
        System.out.println(r.bodyString());
       catch (QiniuException e1) 
        //ignore
        e.printStackTrace();
      
    
  

  /**
   * 获取下载文件路径,即:donwloadUrl
   *
   * @return
   */
  public String getDownloadUrl(String targetUrl) 
    String downloadUrl = auth.privateDownloadUrl(targetUrl);
    return downloadUrl;
  


  /**
   * 文件下载
   *
   * @param targetUrl
   */
  public void download(String targetUrl) 
    //获取downloadUrl
    String downloadUrl = getDownloadUrl(targetUrl);
    //本地保存路径
    String filePath = "E:\\\\chen\\\\";
    download(downloadUrl, filePath);
  


  /**
   * 通过发送http get 请求获取文件资源
   *
   * @param url
   * @param filepath
   * @return
   */
  private static void download(String url, String filepath) 
    OkHttpClient client = new OkHttpClient();
    System.out.println(url);
    Request req = new Request.Builder().url(url).build();
    com.squareup.okhttp.Response resp = null;
    try 
      resp = client.newCall(req).execute();
      System.out.println(resp.isSuccessful());
      if (resp.isSuccessful()) 
        ResponseBody body = resp.body();
        InputStream is = body.byteStream();
        byte[] data = readInputStream(is);
        //判断文件夹是否存在,不存在则创建
        File file = new File(filepath);
        if (!file.exists() && !file.isDirectory()) 
          System.out.println("===文件夹不存在===创建====");
          file.mkdir();
        
        File imgFile = new File(filepath + "888.jpg");
        FileOutputStream fops = new FileOutputStream(imgFile);
        fops.write(data);
        fops.close();
      
     catch (IOException e) 
      e.printStackTrace();
      System.out.println("Unexpected code " + resp);
    
  

  /**
   * 读取字节输入流内容
   *
   * @param is
   * @return
   */
  private static byte[] readInputStream(InputStream is) 
    ByteArrayOutputStream writer = new ByteArrayOutputStream();
    byte[] buff = new byte[1024 * 2];
    int len = 0;
    try 
      while ((len = is.read(buff)) != -1) 
        writer.write(buff, 0, len);
      
      is.close();
     catch (IOException e) 
      e.printStackTrace();
    
    return writer.toByteArray();
  

  public static void main(String args[]) throws IOException 
    String fileName = "xiao.jpg";
    //上传文件的路径
    String FilePath = "C:\\\\Users\\\\ChenXiao\\\\Pictures\\\\Saved Pictures\\\\xiao.jpg";  //本地要上传文件路径
    // new QiniuUtil().upload(FilePath,fileName);

    //构造私有空间的需要生成的下载的链接;
    //格式: http://私有空间绑定的域名/空间下的文件名
    String targetUrl = "http://私有空间绑定的域名/下载文件名称.后缀"
    new QiniuUtil().download(targetUrl);
  


三、具体业务例子(七牛云做图片服务器–SpringBoot)

3.1.pom.xml(此处继承上面的依赖 多引入一个)

    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>fastjson</artifactId>
        <version>1.2.31</version>
    </dependency>

    <dependency>
        <groupId>com.qiniu</groupId>
        <artifactId>qiniu-java-sdk</artifactId>
        <version>7.2.7</version>
    </dependency>

3.2.创建一个html页面

<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
    <form action="/testUpload" method="post" enctype="multipart/form-data">
        <input type="file" name="file" />
        <button type="submit">上传</button>
    </form>
    
</body>
</html>

最简单原始。但这里还是有两个注意的地方,一个是method属性,一个是enctype属性。

3.3.接下来就是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;
    

3.4.接下来写QiniuService.java

@Service
public class QiniuService 

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

    // 设置好账号的ACCESS_KEY和SECRET_KEY
    String ACCESS_KEY = "###################";
    String SECRET_KEY = "###################";
    // 要上传的空间
    String bucketname = "####";

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

    // 测试域名,只有30天有效期
    private static String QINIU_IMAGE_DOMAIN = "http://############/";

    // 简单上传,使用默认策略,只需要设置上传的空间名就可以了
    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;
        
    

这里需要填的地方我都用**#########标注了,要注意的是Zone.zone0()**这个方法,因为你创建的存储空间可能是华北的,华东的或者其他区域的,所以这里可能得调用zone1或者zone2。具体视情况而定。

3.5.最后是controller

@Controller
public class TestController 
    
    @Autowired
    private QiniuService qiniuService;
    
    @RequestMapping(value = "/testUpload", method = RequestMethod.POST)
    @ResponseBody
    public String uploadImage(@RequestParam("file") MultipartFile file,HttpServletRequest request) 
        
        if(file.isEmpty()) 
            return "error";
        
        
        try 
            String fileUrl=qiniuService.saveImage(file);
            return "success, imageUrl = " + fileUrl;
         catch (IOException e) 
            e.printStackTrace();
        
        return "fail";
    

上传成功,则返回图片的地址。

启动SpringBoot项目,输入地址

选择一张图片点击上传,发现返回success和图片的url。

3.6.查看七牛云存储结果

四、总结

总体下来 我们会发现七牛云整体使用下来基本不需要什么配置 还是比较好用的大文件云存储 此外 还有amazon的s3云服务 都是目前比较主流的文件存储方案 当然还有MongoDB的GridFS也是一种大型文件存储方式之一,有其一定的使用场景,务必根据实际场景选择技术方案

java向七牛云上传图片的摆动程序(代码片段)

查看详情

七牛云文件上传助手(代码片段)

qiniuyun_upload_tools最近写博客发现经常要上传图片到七牛云上去,每次打开网页登录然后上传感觉很慢,windows也没有一个好的上传工具,于是写了这样的一个工具。效果使用方法下载程序包点击下载解压后直接在config.json文件里面... 查看详情

七牛云java基础版本(代码片段)

最近用到了七牛云,挺好用的,先来讲一下官方的demo,之后会上传一个自己封装的utils.java文件本文以图片为例更具体的请查看我的下一篇博客,关于七牛云的…….gGradle:compile'com.qiniu:qiniu-java-sdk:7.x.+'MAVEN:<dependency><group... 查看详情

使用七牛接口实现图片和文件一键上传(代码片段)

...主要介绍使用七牛提供的接口把七牛云作为图床,用Python实现图片上传和文件上传的脚本实现,可以支持按文件夹批量上传。搭建过网站的同学,一定都涉及到图片上传和文件上传的问题,最近为了弄图片资源接触了一下云存储... 查看详情

javawebservletjsp使用七牛云api上传图片(代码片段)

文章目录JavaWebservletjsp使用七牛云API上传图片工具类七牛云工具类JDBC工具类servicePhotoServicePhotoServiceImplDaoPhotoDaoPhotoDaoImplvoMyPutRetPhotoResultwebappweb.xmldata.jspdetail.jspindex.jsplist.jsptransfer.jspservletJDBCs 查看详情

thinkphp6上传图片七牛云如何上传文件到七牛云对象储存cos

参考技术AThinkPHP6如何上传图片七牛云,如何上传文件到七牛云对象储存cos,总所周知图片是特别消耗网站带宽的,个人网站将图片上传至七牛云才能显著提升网站的响应速度,手把手交大家如何上配置ThinkPHP6上传文件至七牛云.然后我... 查看详情

微信小程序上传图片及上传到上传到七牛云(代码片段)

微信小程序图片上传功能包含:上传到七牛云、删除图片、查看图片   1.创建子组件tpupload//wxml文件<viewstyle="padding:10px;"><!--图片上传--><viewclass="weui-uploader"><viewclass="img-vweui-uploader__bd">< 查看详情

java实现上传网络图片到七牛云存储(代码片段)

...图片传至七牛云中,给我们返回该图片的地址。代码实现因为七牛云上传图片的时候,传递的是MultipartFile类型,所以我们需要将网络图片utl转换 查看详情

java实现上传网络图片到七牛云存储(代码片段)

...图片传至七牛云中,给我们返回该图片的地址。代码实现因为七牛云上传图片的时候,传递的是MultipartFile类型,所以我们需要将网络图片utl转换 查看详情

七牛云实现js上传

...了。我提供了下载地址。二.html代码<pclass="tip1">本demo实现的图片预览功能需要浏览器支持dataURL,IE8+以及其他标准浏览器都是支持的< 查看详情

jsp使用七牛云api和webuploader上传多组图片(代码片段)

文章目录jsp使用七牛云API和webuploader上传多组图片介绍目录树遇到的问题上传组件的选择问题进度条多线程前端界面数据库关键代码UserPhotoDaoImplUploadServletJDBCServletlist.jspadd.jsppom.xml参考jsp使用七牛云API和webuploader上传多组图片介绍... 查看详情

php表单上传图片到七牛云存储并返回地址……求具体流程~有代码更好

...qiniu/php-sdk/tags戳这个网址下载一下SDK吧,里面封装了文件上传下载等等的方法,我们引入之后可以直接调用。SDK之中有一个qiniu的文件夹,这是所有的SDK实货,这个是最重要的。我们首先要把这个文件夹及里面的文件放到项目文... 查看详情

最强markdown编辑器typora+图床七牛云实现图片自动上传(代码片段)

推荐阅读CSDN主页GitHub开源地址Unity3D插件分享简书地址我的个人博客QQ群:1040082875一、前言Typora首先介绍一下Typora,最强Markdown编辑器,风格简约,功能强大,特别是支持图片复制粘贴,现在又有了图片自... 查看详情

最强markdown编辑器typora+图床七牛云实现图片自动上传(代码片段)

推荐阅读CSDN主页GitHub开源地址Unity3D插件分享简书地址我的个人博客QQ群:1040082875一、前言Typora首先介绍一下Typora,最强Markdown编辑器,风格简约,功能强大,特别是支持图片复制粘贴,现在又有了图片自... 查看详情

web上传图片到七牛云服务器(代码片段)

本文通过javaweb的使用,把要上传的图片通过浏览器上传到服务器上面.`文本仅供参考,可能出现很多不合理;`1创建对应的jsp页面:下面是jsp下面的对应的from表单,上传文件用的那么ImgFiles的属性名称,同样你可以使用其他的,或者... 查看详情

如何用建木ci往七牛云上传文件(代码片段)

#gitee仓库路径#七牛云空间管理中创建的空间名字#七牛云密钥管理中的AK#七牛云密钥管理中的SK#存储区域,不设置时,自动识别,华东:z0;华北:z1;华南:z2;北美:na0;东南亚:as0#上传后在七牛云生成的uri#要上传的文件目... 查看详情

web下载七牛云上面的图片资源(代码片段)

本文将怎么通过浏览器打包下载七牛云服务器上面的图片资源;**如果不用压缩打包处理,可以直接获取流后用对应的out输出就行,不做具体解析;**1先讲怎么打包下载吧.ZipOutputStream我用的是这个工具类创建:ZipOutputStreamout=newZipOutpu... 查看详情

web下载七牛云上面的图片资源(代码片段)

本文将怎么通过浏览器打包下载七牛云服务器上面的图片资源;**如果不用压缩打包处理,可以直接获取流后用对应的out输出就行,不做具体解析;**1先讲怎么打包下载吧.ZipOutputStream我用的是这个工具类创建:ZipOutputStreamout=newZipOutpu... 查看详情