Java整合七牛云进行文件的上传与下载

2023-10-30

一、七牛云的对象存储的介绍

七牛云对象存储 Kodo 是七牛云提供的高可靠、强安全、低成本、可扩展的存储服务。您可通过控制台、API、SDK 等方式简单快速地接入七牛存储服务,实现海量数据的存储和管理。通过 Kodo 可以进行文件的上传、下载和管理。


此外,Kodo 的姊妹产品融合 CDN可以对文件下载进行加速,智能多媒体 API更是提供了丰富的基于海量数据深度学习算法的计算机视觉服务,如人脸技术、场景物体识别、OCR 文字识别和内容审核等。


二、七牛云对象存储(Kodo)主要应用场景

  1. 在线存储和分发

七牛云对象存储提供高可用和高可靠的对象存储服务,您可以放心的将各种内容存储在云端。利用七牛云对象存储的扩展性和按需付费的优势,可以满足您持续快速增长的存储需求。您也可以搭配使用七牛云的对象存储和融合 CDN服务,实现全球覆盖、快速高效的内容分发。

  1. 镜像存储

七牛云对象存储支持镜像存储,这是一种快速的数据迁移和加速服务。可以帮助您实现无缝数据迁移,迁移过程中并不影响原有业务系统的访问。镜像存储适用于迁移原有业务系统的已有数据。

  1. 备份和归档

七牛云对象存储提供高可用和高可靠的存储解决方案来备份和归档您的关键数据。通过七牛云的身份验证机制可以设置不同的访问权限和级别,保障您数据的访问安全。相比传统自建的备份和归档存储系统,您无需在业务初期采购高昂硬件,无需担心数据增长带来的扩容问题,从而节省更多的存储成本、维护成本和人力资源成本。

  1. 富媒体数据处理

针对海量的用户生成内容,七牛云对象存储能够提供跨地域、高并发的内容上传和访问服务。同时结合七牛云提供的数据处理服务,可以在云端实现图片裁剪、格式转化和水印,以及视频转码、切片和拼接等富媒体处理功能,满足移动网络场景下多终端设备的访问需求。

  1. 静态资源托管

七牛云对象存储无缝集合各类第三方扩展插件,如 WordPress、Discuz、Emlog 等,并支持一键将各类插件里的静态资源托管到七牛云对象存储。

三、使用Java进行开发

  1. 整合七牛云SDK
    在Maven中添加七牛云SDK依赖包:

    <dependencies>
    	<dependency>
      		<groupId>com.qiniu</groupId>
      		<artifactId>qiniu-java-sdk</artifactId>
      		<version>7.2.11</version>
      		<scope>compile</scope>
    	</dependency>
    	<dependency>
      		<groupId>com.squareup.okhttp3</groupId>
      		<artifactId>okhttp</artifactId>
      		<version>3.3.1</version>
      		<scope>compile</scope>
    	</dependency>
    	<dependency>
      		<groupId>com.google.code.gson</groupId>
      		<artifactId>gson</artifactId>
      		<version>2.6.2</version>
      		<scope>compile</scope>
    	</dependency>
    	<dependency>
      		<groupId>com.qiniu</groupId>
      		<artifactId>happy-dns-java</artifactId>
      		<version>0.1.4</version>
      		<scope>compile</scope>
    	</dependency>
    	<dependency>
      		<groupId>junit</groupId>
      		<artifactId>junit</artifactId>
      		<version>4.12</version>
      		<scope>test</scope>
    	</dependency>
    </dependencies>
    

    最新官方SDK开发文档地址:https://developer.qiniu.com/kodo/sdk/1239/java#3


  2. 上传文件原理
    根据官方的开发手册可以知道,七牛云服务器接受从客户端直接上传文件,之后再通过回调地址发送回调,对于返回的数据也给了我们很大的自由,我们完全可以自定义需要返回的数据。

    也可以从本地直接上传文件,原理与从客户端上传相似,这里不再赘述。

    七牛云上传文件开发手册链接:https://developer.qiniu.com/kodo/manual/1272/form-upload
    七牛云的仓库有两种,公开仓库和私有仓库,这两种仓库上传的原理相似。

    七牛云的对象存储类似于java中的Map,使用的是键-值的存储方式,键是唯一的,我们可以通过键来改变它所对应的值,所以我们在上传的时候一定要注意保证键的唯一。

    那么七牛云是怎么知道是谁在上传,他应该把上传的文件放在哪里呢?很简单,通过密钥

    我们需要先设置七牛云的密钥,在使用的时候通过密钥生成一个通行证,也就是七牛云的上传凭证,这个上传凭证中包含了你上传文件所需要的所有信息,七牛云可以通过这个通行证得到他所需要的信息。

    首先,我们来设置密钥:

    • 打开七牛云
    • 登录七牛云账号,进入个人中心
      个人中心
    • 直接生成密钥就可以了

    有了密钥以后,我们就可以通过密钥来生成上传凭证了。

    这里我封装了七牛云上传工具类,直接看工具类吧

    package com.kude.controller;
    
    import com.qiniu.util.Auth;
    import com.qiniu.util.StringMap;
    
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.IOException;
    import java.util.HashMap;
    import java.util.Map;
    import java.util.Properties;
    
    public class Qiniu {
    
    	// accessKey
    	private static String accessKey = "access key";
    
    	// secretKey
    	private static String secretKey = "secret key";
    
    	// public Bucket
    	private static String publicBucket = "bucket name";
    
    	// private Bucket
    	private static String privateBucket= "privateBucket";
    
        // 回调地址
        private static String callbackURL = "callBackURL";
    
    	//publicIMGURL
    	private static String publicIMGURL = "IMGURL";
    
    	// priviteIMGURL
    	private static String priviteIMGURL = "priviteIMGURL";
    
    
    	// 静态加载配置文件中的数据
    	static{
    	    try {
    	        FileInputStream in = new FileInputStream("D:\\demo\\svn\\cloud_demo\\cloud_demo\\src\\main\\resources\\datasource.properties");
    	        Properties properties = new Properties();
    	        properties.load(in);
    	        accessKey = properties.getProperty("AccessKey");
    	        secretKey = properties.getProperty("SecretKey");
    	        publicBucket = properties.getProperty("publicBucket");
    	        privateBucket = properties.getProperty("privateBucket");
    	        callbackURL = properties.getProperty("CallBackURL");
    	        publicIMGURL = properties.getProperty("publicIMGURL");
    	        priviteIMGURL = properties.getProperty("priviteIMGURL");
    	        in.close();
    	    } catch (FileNotFoundException e) {
    	        e.printStackTrace();
    	    } catch (IOException e) {
    	        e.printStackTrace();
    	    }
    	}
    
    
    	/**
    	 *
    	 * 得到上传凭证和资源下载路径
    	 * @param bocket 指定是在共有仓库还是私有仓库中,0为私有仓库,非0为共有仓库
    	 * @param key 资源的key
    	 * @return 一个存有上传凭证
    	 */
    	public static Map<String,String> getUploadToken(int bocket, String key){
    	    Map<String,String> data = new HashMap<>();
    
    	    // 将上传凭证放入map中
    	    data.put("token",getuplodTokenByKey(key));
    
        	// 图片地址
        	data.put("url",getUrl(bocket,key));
        	return data;
    	}
    
    	/**
    	 * 得到资源的访问地址,也是下载地址
    	 * @param bocket 指定是在共有仓库还是私有仓库中,0为私有仓库,非0为共有仓库
    	 * @param key 资源的key
    	 * @return 资源的访问地址
    	 */
    	private static String getUrl(int bocket,String key){
    	    if(bocket == 0){
    	        return getstaticDownloadToken(priviteIMGURL+key);
    	    }else{
    	        return publicIMGURL+key;
    	    }
    	}
    
    
    
    	public static String getuplodTokenByKey(String key){
    
    
            // 第一步: 先生成一个Auth验证
            Auth auth = Auth.create(accessKey, secretKey);
    
    
    	    // 第二步: 使用StringMap工具类拼装参数
    	    StringMap putPolicy = new StringMap();
    
    	    /*
    	     * 指定上传的目标资源空间 Bucket 和资源键 Key(最大为 750 字节)。有三种格式:
    	     *   1. <bucket>,表示允许用户上传文件到指定的 bucket。在这种格式下文件只能新增	
        	 *       (分片上传需要指定insertOnly为1才是新增,否则也为覆盖上传),若已存在同名资源(且文件内容/etag不一致),
             *       上传会失败;若已存在资源的内容/etag一致,则上传会返回成功。
             *
             *
             *   2. <bucket>:<key>,表示只允许用户上传指定 key 的文件。
             *       在这种格式下文件默认允许修改,若已存在同名资源则会被覆盖。
             *       如果只希望上传指定 key 的文件,并且不允许修改,那么可以将下面的 insertOnly 属性值设为 1。
             *
             *
             *   3. <bucket>:<keyPrefix>,表示只允许用户上传指定以 keyPrefix 为前缀的文件,
             *       当且仅当 isPrefixalScope 字段为 1 时生效,isPrefixalScope 为 1 时无法覆盖上传。
    	     *
    	     * type : String
    	     * */
    	    putPolicy.put("scope",publicBucket);
    
    
    
    
    	    // 上传凭证有效截止时间。Unix时间戳,单位为秒。该截止时间为上传完成后,在七牛空间生成文件的校验时间,
    	    // 而非上传的开始时间,一般建议设置为上传开始时间 + 3600s
    	    // type : uint32
    	    putPolicy.put("deadline",(System.currentTimeMillis()/1000L + 3600));
    
    
    
    
    
    	    // Web 端文件上传成功后,浏览器执行 303 跳转的 URL。通常用于表单上传。文件上传成功后会跳转到
    	    // <returnUrl>?upload_ret=<queryString>,<queryString>包含 returnBody 内容。
    	    // 如不设置 returnUrl,则直接将 returnUrlnBody 的内容返回给客户端。
    	    // type : String
    //        putPolicy.put("returnUrl","");
    
    
    
    	    /*
    	     *上传成功后,自定义七牛云最终返回給上传端(在指定 returnUrl 时是携带在跳转路径参数中)的数据。
        	 * 支持魔法变量和自定义变量。returnBody 要求是合法的 JSON 文本。
        	 * 例如 {"key": $(key), "hash": $(etag), "w": $(imageInfo.width), "h": $(imageInfo.height)}。
         	*/
        	// type : String
        	putPolicy.put("returnBody","{\"key\": $(key), \"hash\": $(etag), \"w\": $(imageInfo.width), \"h\": $(imageInfo.height)}");
    
    
    
    
        	/*
        	 *
        	 * 上传成功后,七牛云向业务服务器发送 Content-Type: application/x-www-form-urlencoded 的 POST 请求。
         	* 业务服务器可以通过直接读取请求的 query 来获得该字段,支持魔法变量和自定义变量。
         	* callbackBody 要求是合法的 url query string。
         	* 例如key=$(key)&hash=$(etag)&w=$(imageInfo.width)&h=$(imageInfo.height)。
         	* 如果callbackBodyType指定为application/json,则callbackBody应为json格式,
         	* 例如:{"key":"$(key)","hash":"$(etag)","w":"$(imageInfo.width)","h":"$(imageInfo.height)"}。
         	* */
        	// type : String
        	putPolicy.put("callbackBody","{\"key\":\"$(key)\",\"hash\":\"$(etag)\",\"w\":\"$(imageInfo.width)\",\"h\":\"$(imageInfo.height)\"}");
    
    
            //上传成功后,七牛云向业务服务器发送回调通知 callbackBody 的 Content-Type。
            // 默认为 application/x-www-form-urlencoded,也可设置为 application/json。
            // type : String
            putPolicy.put("callbackBodyType","application/json");
    
    
            // 第三步: 生成一个上传凭证
    
            return auth.uploadToken(publicBucket,key,(System.currentTimeMillis()/1000L+3600),putPolicy);
        }
    
    
    
    
        /**
         * 获得一个私有空间下载的凭证,传入的参数是按照公开仓库访问方式生成的URL
         * @param baseUrl 按照公开仓库生成URL的方式生成的URL
         * @return
         */
        public static String getstaticDownloadToken(String baseUrl){
            Auth auth = Auth.create(accessKey, secretKey);
            return auth.privateDownloadUrl(baseUrl);
        }
    
    
    
        /**
         * 指定在七牛云上面的存储路径
         * @return
         */
        public String getDynamicUpToken(String resporties){
    
    		Auth auth = Auth.create(accessKey, secretKey);
    
        	StringMap putPolicy = new StringMap();
    
        	putPolicy.put("scope",resporties);
    
        	putPolicy.put("deadline",(System.currentTimeMillis()/1000L + 3600));
    
        	putPolicy.put("returnBody","{\"key\": $(key), \"hash\": $(etag), \"w\": $(imageInfo.width), \"h\": $(imageInfo.height)}");
    
        	putPolicy.put("callbackBody","{\"key\":\"$(key)\",\"hash\":\"$(etag)\",\"w\":\"$(imageInfo.width)\",\"h\":\"$(imageInfo.height)\"}");
    
        	putPolicy.put("callbackBodyType","application/json");
    
        	return auth.uploadToken(publicBucket,null,(System.currentTimeMillis()/1000L+3600),putPolicy);
    	}
    
    
    
    
    
    	/**
     	* 可以根据需求自己封装要生成的凭证
     	* 默认得到一个6分钟后过期的动态上传凭证,这个凭证可以让文件上传到默认仓库中
     	*
     	* 这个是所有上传凭证的原型,不能动
     	*
     	* @return
     	*/
    	public static String getDefaultDynamicUpToken(){
    
    
        	// 第一步: 先生成一个Auth验证
        	Auth auth = Auth.create(accessKey, secretKey);
    
    
        	// 第二步: 使用StringMap工具类拼装参数
        	StringMap putPolicy = new StringMap();
    
        	/*
        	 * 指定上传的目标资源空间 Bucket 和资源键 Key(最大为 750 字节)。有三种格式:
        	 *   1. <bucket>,表示允许用户上传文件到指定的 bucket。在这种格式下文件只能新增
        	 *       (分片上传需要指定insertOnly为1才是新增,否则也为覆盖上传),若已存在同名资源(且文件内容/etag不一致),
        	 *       上传会失败;若已存在资源的内容/etag一致,则上传会返回成功。
        	 *
         	 *
         	 *   2. <bucket>:<key>,表示只允许用户上传指定 key 的文件。
        	 *       在这种格式下文件默认允许修改,若已存在同名资源则会被覆盖。
        	 *       如果只希望上传指定 key 的文件,并且不允许修改,那么可以将下面的 insertOnly 属性值设为 1。
        	 *
        	 *
        	 *   3. <bucket>:<keyPrefix>,表示只允许用户上传指定以 keyPrefix 为前缀的文件,
        	 *       当且仅当 isPrefixalScope 字段为 1 时生效,isPrefixalScope 为 1 时无法覆盖上传。
        	 *
        	 * type : String
        	 * */
        	putPolicy.put("scope",publicBucket);
    
    
    
        	// 若为 1,表示允许用户上传以 scope 的 keyPrefix 为前缀的文件。
        	// type : int
    //        putPolicy.put("isPrefixalScope",1);
    
    
    
        	// 上传凭证有效截止时间。Unix时间戳,单位为秒。该截止时间为上传完成后,在七牛空间生成文件的校验时间,
        	// 而非上传的开始时间,一般建议设置为上传开始时间 + 3600s
        	// type : uint32
        	putPolicy.put("deadline",(System.currentTimeMillis()/1000L + 3600));
    
    
    
        	// 限定为新增语意。如果设置为非 0 值,则无论 scope 设置为什么形式,仅能以新增模式上传文件。
        	// type : int
    //        putPolicy.put("insertOnly",0);
    
    
    
        	// 唯一属主标识。特殊场景下非常有用,例如根据 App-Client 标识给图片或视频打水印。
        	// type : String
    //        putPolicy.put("endUser","");
    
    
    
        	// Web 端文件上传成功后,浏览器执行 303 跳转的 URL。通常用于表单上传。文件上传成功后会跳转到
        	// <returnUrl>?upload_ret=<queryString>,<queryString>包含 returnBody 内容。
        	// 如不设置 returnUrl,则直接将 returnUrlnBody 的内容返回给客户端。
        	// type : String
    //        putPolicy.put("returnUrl","");
    
    
    
        	/*
        	 *上传成功后,自定义七牛云最终返回給上传端(在指定 returnUrl 时是携带在跳转路径参数中)的数据。
        	 * 支持魔法变量和自定义变量。returnBody 要求是合法的 JSON 文本。
        	 * 例如 {"key": $(key), "hash": $(etag), "w": $(imageInfo.width), "h": $(imageInfo.height)}。
        	 */
        	// type : String
        	putPolicy.put("returnBody","{\"key\": $(key), \"hash\": $(etag), \"w\": $(imageInfo.width), \"h\": $(imageInfo.height)}");
    
    
    
        	/*
        	 * 上传成功后,七牛云向业务服务器发送 POST 请求的 URL。
        	 * 必须是公网上可以正常进行 POST 请求并能响应 HTTP/1.1 200 OK 的有效 URL。
        	 * 另外,为了给客户端有一致的体验,我们要求 callbackUrl 返回包 Content-Type 为 "application/json",
        	 * 即返回的内容必须是合法的 JSON 文本。出于高可用的考虑,本字段允许设置多个 callbackUrl(用英文符号 ; 分隔),
        	 * 在前一个 callbackUrl 请求失败的时候会依次重试下一个 callbackUrl。
        	 *
        	 * 一个典型例子是:http://<ip1>/callback;http://<ip2>/callback,并同时指定下面的 callbackHost 字段。
        	 * 在 callbackUrl 中使用 ip 的好处是减少对 dns 解析的依赖,可改善回调的性能和稳定性。
        	 * 指定 callbackUrl,必须指定 callbackbody,且值不能为空。
        	 * */
        	// type : String
    //        putPolicy.put("callbackUrl","");
    
    
    
    
        	//上传成功后,七牛云向业务服务器发送回调通知时的 Host 值。与 callbackUrl 配合使用,仅当设置了 callbackUrl 时才有效。
    //        putPolicy.put("callbackHost","");
    
    
    
    
        	/*
        	 *
        	 * 上传成功后,七牛云向业务服务器发送 Content-Type: application/x-www-form-urlencoded 的 POST 请求。
        	 * 业务服务器可以通过直接读取请求的 query 来获得该字段,支持魔法变量和自定义变量。
        	 * callbackBody 要求是合法的 url query string。
        	 * 例如key=$(key)&hash=$(etag)&w=$(imageInfo.width)&h=$(imageInfo.height)。
        	 * 如果callbackBodyType指定为application/json,则callbackBody应为json格式,
        	 * 例如:{"key":"$(key)","hash":"$(etag)","w":"$(imageInfo.width)","h":"$(imageInfo.height)"}。
        	 * */
        	// type : String
        	putPolicy.put("callbackBody","{\"key\":\"$(key)\",\"hash\":\"$(etag)\",\"w\":\"$(imageInfo.width)\",\"h\":\"$(imageInfo.height)\"}");
    
    
    
    
        	//上传成功后,七牛云向业务服务器发送回调通知 callbackBody 的 Content-Type。
        	// 默认为 application/x-www-form-urlencoded,也可设置为 application/json。
        	// type : String
        	putPolicy.put("callbackBodyType","application/json");
    
    
    
        	/*
        	 * 资源上传成功后触发执行的预转持久化处理指令列表。支持魔法变量和自定义变量。
        	 * 每个指令是一个 API 规格字符串,多个指令用;分隔。请参阅persistenOps详解与示例。
        	 * 同时添加 persistentPipeline 字段,使用专用队列处理,请参阅persistentPipeline。
        	 * */
        	// type : String
    //        putPolicy.put("persistentOps","");
    
    
    
    
        	/*
        	 * 接收持久化处理结果通知的 URL。必须是公网上可以正常进行 POST 请求并能响应 HTTP/1.1 200 OK 的有效 URL。
        	 * 该 URL 获取的内容和持久化处理状态查询的处理结果一致。
        	 * 发送 body 格式是 Content-Type 为 application/json 的 POST 请求,
        	 * 需要按照读取流的形式读取请求的body才能获取
        	 * */
        	// type : String
    //        putPolicy.put("persistentNotifyUrl","");
    
    
    
    
        	//转码队列名。资源上传成功后,触发转码时指定独立的队列进行转码。为空则表示使用公用队列,处理速度比较慢。建议使用专用队列。
        	// type : String
    //        putPolicy.put("persistentPipeline","");
    
    
    
    
    
        	//saveKey的优先级设置。为 true 时,saveKey不能为空,会忽略客户端指定的key,强制使用saveKey进行文件命名。参数不设置时,默认值为false
        	// type : String
    //        putPolicy.put("forceSaveKey",false);
    
    
    
    
        	//自定义资源名。支持魔法变量和自定义变量。forceSaveKey 为false时,这个字段仅当用户上传的时候没有主动指定 key 时起作用;
        	// forceSaveKey 为true时,将强制按这个字段的格式命名。
        	// type : String
    //        putPolicy.put("saveKey","");
    
    
    
    
        	// 限定上传文件大小最小值,单位Byte。
        	// type : int64
    //        putPolicy.put("fsizeMin",1024);
    
    
    
    
    
        	// 限定上传文件大小最大值,单位Byte。超过限制上传文件大小的最大值会被判为上传失败,返回 413 状态码。
        	// type : int64
    //        putPolicy.put("fsizeLimit",2048);
    
    
    
    
        	/*
        	 * 开启 MimeType 侦测功能。设为非 0 值,则忽略上传端传递的文件 MimeType 信息,使用七牛服务器侦测内容后的判断结果。
        	 * 默认设为 0 值,如上传端指定了 MimeType 则直接使用该值,否则按如下顺序侦测 MimeType 值:
        	 * 1. 检查文件扩展名;
        	 * 2. 检查 Key 扩展名;
        	 * 3. 侦测内容。
        	 * 如不能侦测出正确的值,会默认使用 application/octet-stream。
        	 */
        	// type : int
    //        putPolicy.put("detectMime",1);
    
    
    
    
    
        	/*
        	 * 限定用户上传的文件类型。指定本字段值,七牛服务器会侦测文件内容以判断 MimeType,再用判断值跟指定值进行匹配,匹配成功则允许上传,匹配失败则返回 403 状态码。示例:
        	 * image/*表示只允许上传图片类型
        	 * image/jpeg;image/png表示只允许上传jpg和png类型的图片
        	 * !application/json;text/plain表示禁止上传json文本和纯文本。注意最前面的感叹号!
        	 */
        	// type : String
    //        putPolicy.put("mimeLimit","");
    
    
    
    
        	// 文件存储类型。0 为普通存储(默认),1 为低频存储。
        	// type : int
    //        putPolicy.put("fileType",0);
    
    
    
    
        	// 第三步: 生成一个上传凭证
    
        	return auth.uploadToken(publicBucket,null,(System.currentTimeMillis()/1000L+3600),putPolicy);
    	}
    
    
    	public static void main(String[] args) {
        	System.out.println(Qiniu.getUploadToken(1, "test"));
    	}
    
    }
    

    在这里面,我将我的数据源配置到了配置文件中,从配置文件中读取。

    这里再放上一个简陋的测试页面:

    <!DOCTYPE html>
    <html lang="en">
    <head>
    	<meta charset="UTF-8">
    	<title>客户端表单上传文件</title>
    </head>
    <body>
    
    <!--action中填写上传地址,上传地址参考   https://developer.qiniu.com/kodo/manual/1671/region-endpoint-->
    <form method="post" action="http://upload.qiniup.com/"
      enctype="multipart/form-data" accept-charset="UTF-8">
    
    	<input name="key" type="hidden" value="6484sdfs54665465">
    	<!--必须是一个符合相应规格的上传凭证,否则会返回 401 表示权限认证失败。-->
    	<input name="token" type="hidden" value="这里是你生成的上传凭证">
    
    	<!--文件本身。-->
    	<input name="file" type="file" />
    	<input type="submit" value="上传文件" />
    </form>
    
    下载:<a href="http://pubgwqeja.bkt.clouddn.com/sldsdf">下载</a>
    
    </body>
    </html>
    



这个是我使用js将后台传过来的token和key填入表单的代码:

	<!DOCTYPE html>
	<html>
		<head>
			<meta charset="utf-8">
			<title>系统设置-广告设置</title>
			<link rel="icon" href="data:;base64,=">
			<link rel="stylesheet" type="text/css" href="../../layui/css/layui.css" />
			<script src="../../js/jquery-3.4.0.js"></script>
			<script src="../../layui/layui.js" type="text/javascript" charset="utf-8"></script>
		</head>
		<body>
		
			<form method="post" action="http://upload.qiniup.com/" enctype="multipart/form-data">
				<input name="key" id="key" type="hidden">
				<input name="token" id="token" type="hidden" >
				<input name="file" id="file" type="file" />
				<input type="submit" value="上传文件" />
			</form>
		
		
			<script type="text/javascript">
				// 页面加载的时候使用ajax获得上传凭证,并将它赋值给token标签
				jQuery(document).ready(function() {
					jQuery.post({
						url: "http://localhost:8080/systemSettings/advance/getToken.do",
						success: function(result) {
							try {
								var alldata = eval("(" + result + ")");
								var keyNode = document.getElementById("key");
								keyNode.value = alldata.key;
							
								var tokenNode = document.getElementById("token");
								tokenNode.value = alldata.token;
			
							 	alert("key:"+alldata.key);
							 	alert("token:"+alldata.token);
							} catch (e) {
								//TODO handle the exception
								console.log("还是错了");
							}
		
						}
					})
				});
			</script>
			</body>
	</html>



  1. 下载文件原理
    下载文件的原理相比较于上传文件要简单很 多,在公开仓库中的文件,可以直接访问他的URL进行下载,私有仓库中的文件则是需要先获得下载凭证才能进行下载,下载凭证的方法在上面已经有了,就不再进行展示了。
    下载文件开发手册:https://developer.qiniu.com/kodo/manual/1232/download-process
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java整合七牛云进行文件的上传与下载 的相关文章

随机推荐

  • Docker之一:账号注册

    Docker之一 账号注册 在学习Docker之前 我们需要在Docker官网注册一个账号 方便后续下载安装包等操作 在主页面点击 Sign in 注册 Sign Up 填写注册信息 然后点击 Sign Up 选择Free 如果您有需求 可
  • python读取excel文件并保存成array

    要使用xlrd包 import numpy as np import xlrd 读取excel的库 resArray 先声明一个空list data xlrd open workbook demo xlsx 读取文件 table data
  • 【SQL基础】SQL增删改查基本语句

    目录 1 SQL 增删改查基本语句 2 select 语句 2 1 select 基本语句 2 2 Select where 语句 2 3 Select order by 语句 2 4 Select group by 语句 3 Select
  • 求解决,ubuntu16.04 文件“桌面/文档/下载/图片…”切换为英文,出现无法打开的空链接文件,错误报告以及显示

    文章参考 ubuntu下面 将汉字桌面 下载 换成 英文 https blog csdn net tanhuanzheng article details 103557287 ubuntu16 04 vmware虚拟机 1 我们可以先将目录
  • Ubuntu 16.04配置国内高速apt-get更新源

    Ubuntu 16 04下载软件速度有点慢 因为默认的是从国外下载软件 那就更换到国内比较好的快速更新源 就是这些软件所在的服务器 一般直接百度Ubuntu更新源就能出来一大堆 这时候最好是找和自己Ubuntu版本一致的更新源 我的Ubun
  • MFC入门基础(九)消息对话框、文件对话框

    一 消息对话框主要是两种CWnd MessageBox 和AfxMessageBox 下面是在按钮点击事件中添加MessageBox的效果 如下 void Ctest02Dlg OnBnClickedAddButton TODO 在此添加控
  • form表单 input输入框及属性

  • 启动Hadoop时一直提示输入密码的问题(SSH配置)

    目录 1 首先检查自己是否有配置本地ssh免密登录 2 另外一种方式 科普 什么是SSH 情况如下图所示 经常弹出要要我输入password 1 首先检查自己是否有配置本地ssh免密登录 a 下载SSH服务 yum install open
  • js vue 使用 map和computed巧妙设计可选列表和已选列表的联动

    需求说明 当已选列表中存在了可选列表的选项 则在可选列表中做出标记 使用map和computed的巧妙写法 otherFiledList是已选数据 fieldList是可选数据 已选数据是可选数据构成的 div i class el ico
  • 16. Dubbo原理解析-集群&容错之router路由服务

    Router服务路由 根据路由规则从多个Invoker中选出一个子集AbstractDirectory是所有目录服务实现的上层抽象 它在list列举出所有invokers后 会在通过Router服务进行路由过滤 Router接口定义 pub
  • 2016——大数据版图

    编者注 原文是 FirstMark Capital 的 Matt Turck 的文章 本文全面总结了大数据领域的发展态势 分析认为尽管大数据作为一个术语似乎已经过气 但是大数据分析与应用才刚刚开始兴起 在与 AI 人工智能等新兴技术的结合下
  • JSON格式转MAP的6种方法

    JSON字符串自动转换 Created by zkn on 2016 8 22 public class JsonToMapTest01 public static void main String args String str 0 zh
  • MySQL中的各种自增ID

    微信搜索 coder home 或扫一扫下面的二维码 关注公众号 第一时间了解更多干货分享 还有各类视频教程资源 扫描它 带走我 文章目录 背景 自增ID的数据类型 单位换算规则 自增ID取值范围 无符号位的计算方式 有符号位的计算方式 i
  • JDialog弹窗

    JDialog弹窗 package com chen lesson4 import javax swing import java awt import java awt event ActionEvent import java awt
  • python后端学习(二)TCP客户端和服务端

    TCP简介 TCP协议 传输控制协议 英语 Transmission Control Protocol 缩写为 TCP 是一种面向连接的 可靠的 基于字节流的传输层通信协议 由IETF的RFC 793定义 TCP通信需要经过创建连接 数据传
  • 14 【接口规范和业务分层】

    14 接口规范和业务分层 1 接口规范 RESTful架构 1 1 什么是REST REST全称是Representational State Transfer 中文意思是表述 编者注 通常译为表征 性状态转移 它首次出现在2000年Roy
  • android EditText 实时监听输入框的内容

    在开发中很多时候我们都会用到EditText 对输入内容的实时监听也是不可或缺的 在android中为我们提供了TextWatcher这个类 我们只要extends这个类然后etColler addTextChangedListener e
  • C#基础知识框架整理

    目录 NET FrameWork框架 NET平台 类库 快速启动vs sln文件的使用 在解决方案里 csprog文件的使用 在项目文件夹里 排除语法错误 设置行号 设置字体 恢复出厂设置 自动切换运行的项目 C 的3种注释符 C 常用的快
  • 浙大计算机学院博士毕业论文要求,浙大在读博士需要3篇SCI 论文才能毕业,清华博士却不作要求!...

    原标题 浙大在读博士需要3篇SCI 论文才能毕业 清华博士却不作要求 最近 又进入了一年的秋招季 很多学子纷纷加入求职大军之中 但是今年却有不一样的声音 有在读研究生表示 学校对毕业要求提高 要在专业期刊发表论文 这成了比找工作更让人烦心的
  • Java整合七牛云进行文件的上传与下载

    一 七牛云的对象存储的介绍 七牛云对象存储 Kodo 是七牛云提供的高可靠 强安全 低成本 可扩展的存储服务 您可通过控制台 API SDK 等方式简单快速地接入七牛存储服务 实现海量数据的存储和管理 通过 Kodo 可以进行文件的上传 下