百度网盘上传文件
This commit is contained in:
2
pom.xml
2
pom.xml
@ -207,7 +207,7 @@
|
|||||||
<module>ruoyi-common</module>
|
<module>ruoyi-common</module>
|
||||||
<module>ruoyi-yunbookmark</module>
|
<module>ruoyi-yunbookmark</module>
|
||||||
<module>ruoyi-note</module>
|
<module>ruoyi-note</module>
|
||||||
|
<module>yunpan-baidu</module>
|
||||||
</modules>
|
</modules>
|
||||||
<packaging>pom</packaging>
|
<packaging>pom</packaging>
|
||||||
|
|
||||||
|
@ -89,6 +89,11 @@
|
|||||||
<artifactId>spring-boot-starter-test</artifactId>
|
<artifactId>spring-boot-starter-test</artifactId>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.apache.httpcomponents</groupId>
|
||||||
|
<artifactId>httpmime</artifactId>
|
||||||
|
<version>4.5.6</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
||||||
|
@ -0,0 +1,143 @@
|
|||||||
|
package com.ruoyi.web.test.controller;
|
||||||
|
|
||||||
|
|
||||||
|
import cn.hutool.http.HttpUtil;
|
||||||
|
import com.alibaba.fastjson.JSONObject;
|
||||||
|
import com.ruoyi.baidu.servise.BaiduWangPanServise;
|
||||||
|
import com.ruoyi.common.constant.BaiduUrl;
|
||||||
|
import org.apache.commons.codec.digest.DigestUtils;
|
||||||
|
import org.junit.Test;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
|
||||||
|
import java.io.*;
|
||||||
|
import java.util.HashMap;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @Auther: Wang
|
||||||
|
* @Date: 2021/07/24 22:37
|
||||||
|
* 功能描述:
|
||||||
|
* //教程
|
||||||
|
* //https://blog.csdn.net/admans/article/details/80653490
|
||||||
|
*/
|
||||||
|
public class BaiDuWangPan extends BaseSpringBootTest{
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private BaiduWangPanServise baiduWangPanServise;
|
||||||
|
|
||||||
|
private static String access_token = "123.5f2c72c8c2106a3baa177de77331b1d1.YnelNhviWQotgsooAt63iCRbaqZrjEP0Qgj3nIx.jMfNkQ";
|
||||||
|
|
||||||
|
|
||||||
|
// 获取用户信息
|
||||||
|
@Test
|
||||||
|
public void getUser() {
|
||||||
|
String result = baiduWangPanServise.getUserInfo(access_token);
|
||||||
|
JSONObject object = JSONObject.parseObject(result);
|
||||||
|
System.out.println("result:" + result);
|
||||||
|
System.out.println("baidu_name:" + object.get("baidu_name"));
|
||||||
|
System.out.println("netdisk_name:" + object.get("netdisk_name"));
|
||||||
|
}
|
||||||
|
|
||||||
|
// 获取容量
|
||||||
|
@Test
|
||||||
|
public void getCapacity() {
|
||||||
|
String result = baiduWangPanServise.getCapacity(access_token);
|
||||||
|
System.out.println("result:" + result);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// 上传文件
|
||||||
|
@Test
|
||||||
|
public void addFile() {
|
||||||
|
|
||||||
|
//预上传、分片上传、创建文件
|
||||||
|
String md5 = "";
|
||||||
|
try {
|
||||||
|
md5 = DigestUtils.md5Hex(new FileInputStream(new File("D:\\Wang\\22.txt")));
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
//预上传 获取ID
|
||||||
|
|
||||||
|
HashMap<String, Object> paramMap = new HashMap<>();
|
||||||
|
paramMap.put("access_token", access_token);
|
||||||
|
paramMap.put("path", "/apps/藏趣云/22.txt");
|
||||||
|
paramMap.put("size", "1");//文件或目录的大小,单位B
|
||||||
|
paramMap.put("isdir", "0");//是否目录,0 文件、1 目录
|
||||||
|
paramMap.put("block_list", "[\"" + md5 + "\"]");
|
||||||
|
paramMap.put("autoinit", 1);
|
||||||
|
String result = HttpUtil.post("https://pan.baidu.com/rest/2.0/xpan/file?method=precreate&access_token" + access_token, paramMap);
|
||||||
|
System.out.println("result:" + result);
|
||||||
|
|
||||||
|
JSONObject object = JSONObject.parseObject(result);
|
||||||
|
String uploadid = object.getString("uploadid");
|
||||||
|
System.out.println("uploadid:" + uploadid);
|
||||||
|
|
||||||
|
|
||||||
|
//上传文件
|
||||||
|
HashMap<String, Object> paramMap1 = new HashMap<>();
|
||||||
|
// paramMap1.put("file", ReadFileToCharArray("D:\\Wang\\22.txt"));
|
||||||
|
paramMap1.put("file", new File("D:\\Wang\\22.txt"));
|
||||||
|
|
||||||
|
System.out.println("file:" + paramMap1.get("file").toString());
|
||||||
|
|
||||||
|
// String result2 = HttpUtil.post("https://d.pcs.baidu.com/rest/2.0/pcs/superfile2?access_token=" + access_token + "&method=upload&type=tmpfile&path=%2Fapps%2F%E8%97%8F%E8%B6%A3%E4%BA%91%2F22.txt&partseq=0&uploadid=" + uploadid, paramMap1);
|
||||||
|
// System.out.println("result2:" + result2);
|
||||||
|
String url = Constant.SLICING_UPLOAD_FILE_URL + "?method=upload" +
|
||||||
|
"&access_token=" + Constant.ATOKEN +
|
||||||
|
"&type=tmpfile&partseq=0" +
|
||||||
|
"&path=" + Constant.APP_PATH + "22.txt" +
|
||||||
|
"&uploadid=" + uploadid;
|
||||||
|
String result2 = FileUtilsBaidu.sendFile(url,new File("D:\\Wang\\22.txt"));
|
||||||
|
System.out.println("result2:" + result2);
|
||||||
|
|
||||||
|
//创建文件
|
||||||
|
HashMap<String, Object> paramMap3 = new HashMap<>();
|
||||||
|
// paramMap1.put("file", ReadFileToCharArray("D:\\Wang\\22.txt"));
|
||||||
|
paramMap3.put("path", "/apps/藏趣云/22.txt");
|
||||||
|
paramMap3.put("size", 6);
|
||||||
|
paramMap3.put("isdir", 0);
|
||||||
|
|
||||||
|
|
||||||
|
String result3 = HttpUtil.post("https://pan.baidu.com/rest/2.0/xpan/file?method=create&access_token=" + access_token, paramMap3);
|
||||||
|
System.out.println("result3:" + result3);
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//将文件转换成char[]数组
|
||||||
|
public static char[] ReadFileToCharArray(String filePath) throws IOException {
|
||||||
|
StringBuilder fileData = new StringBuilder(1000);
|
||||||
|
BufferedReader reader = new BufferedReader(new FileReader(filePath));
|
||||||
|
|
||||||
|
char[] buf = new char[10];
|
||||||
|
int numRead = 0;
|
||||||
|
while ((numRead = reader.read(buf)) != -1) {
|
||||||
|
System.out.println(numRead);
|
||||||
|
String readData = String.valueOf(buf, 0, numRead);
|
||||||
|
fileData.append(readData);
|
||||||
|
buf = new char[1024];
|
||||||
|
}
|
||||||
|
|
||||||
|
reader.close();
|
||||||
|
|
||||||
|
return fileData.toString().toCharArray();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,55 @@
|
|||||||
|
package com.ruoyi.web.test.controller;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @Auther: Wang
|
||||||
|
* @Date: 2021/07/25 02:03
|
||||||
|
* 功能描述:
|
||||||
|
*/
|
||||||
|
public interface Constant {
|
||||||
|
String APP_ID="24066444";
|
||||||
|
String APP_NAME="藏趣云";
|
||||||
|
String APP_KEY="7NpRdcorSxoqxIKAkzLXuOhVr8NQekA9";
|
||||||
|
String SECRET_KEY="RfvvGbkN95CuXlaoZVzzsvGiz9Her6qq";
|
||||||
|
String SING_key="dBpomXW%duC2L8l6MW3yTpaXhX=-8oj0";
|
||||||
|
String APP_PATH="/apps/"+APP_NAME+"/";
|
||||||
|
|
||||||
|
// https://openapi.baidu.com/oauth/2.0/authorize?response_type=code&client_id=7NpRdcorSxoqxIKAkzLXuOhVr8NQekA9&redirect_uri=https://www.baidu.com/&scope=basic,netdisk&display=tv&qrcode=1&force_login=1
|
||||||
|
// https://openapi.baidu.com/oauth/2.0/token?grant_type=authorization_code&code=0a291eb3fd3ed6ccc74cc46bc5540191&client_id=7NpRdcorSxoqxIKAkzLXuOhVr8NQekA9&client_secret=RfvvGbkN95CuXlaoZVzzsvGiz9Her6qq&redirect_uri=oob
|
||||||
|
//单位mb
|
||||||
|
// 普通用户单个分片大小固定为4MB(文件大小如果小于4MB,无需切片,直接上传即可),单文件总大小上限为4G。
|
||||||
|
//普通会员用户单个分片大小上限为16MB,单文件总大小上限为10G。
|
||||||
|
//超级会员用户单个分片大小上限为32MB,单文件总大小上限为20G。
|
||||||
|
Integer UNIT=4;
|
||||||
|
|
||||||
|
|
||||||
|
//获取授权码,需要扫码登陆
|
||||||
|
String GET_CODE_URL="https://openapi.baidu.com/oauth/2.0/authorize?response_type=code&client_id="+APP_KEY+"&redirect_uri=oob&scope=basic,netdisk&display=tv&qrcode=1&force_login=1";
|
||||||
|
|
||||||
|
//获取到的授权码
|
||||||
|
String CODE="0a291eb3fd3ed6ccc74cc46bc5540191";
|
||||||
|
|
||||||
|
//根据授权码换取token
|
||||||
|
String GET_TOKEN_BY_CODE="https://openapi.baidu.com/oauth/2.0/token?grant_type=authorization_code&code="+CODE+"&client_id="+APP_KEY+"&client_secret="+SECRET_KEY+"&redirect_uri=oob";
|
||||||
|
|
||||||
|
//获取到的TOKEN
|
||||||
|
String RTOKEN="122.fec5f9d6dd1644c2c57c89cc510f7ec8.YBMpVZwjo9y5kSMFnVmSMJL9dj25T5X02gjLwV8.1J2sEw";
|
||||||
|
String ATOKEN="121.d8ab3687bd67e9b245b6a10f7af7afc3.YCQGBie5JO6U7nCl-ZLVC3pX-sTUFIgnV6hH1Rw.3zI4rQ";
|
||||||
|
|
||||||
|
|
||||||
|
//操作文件 copy, mover, rename, delete
|
||||||
|
String FILE_MANAGER_URL=" https://pan.baidu.com/rest/2.0/xpan/file";
|
||||||
|
|
||||||
|
//预上传
|
||||||
|
String GET_READY_FILE_URL="https://pan.baidu.com/rest/2.0/xpan/file";
|
||||||
|
|
||||||
|
//分片上传
|
||||||
|
String SLICING_UPLOAD_FILE_URL="https://d.pcs.baidu.com/rest/2.0/pcs/superfile2";
|
||||||
|
|
||||||
|
//下载文件
|
||||||
|
String DOWN_LOUE_URL="https://pan.baidu.com/rest/2.0/xpan/multimedia";
|
||||||
|
|
||||||
|
//文件搜索
|
||||||
|
String FILE_SEARCH="https://pan.baidu.com/rest/2.0/xpan/file?method=search";
|
||||||
|
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,183 @@
|
|||||||
|
package com.ruoyi.web.test.controller;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.FileInputStream;
|
||||||
|
import java.io.FileNotFoundException;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.text.DecimalFormat;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @Auther: Wang
|
||||||
|
* @Date: 2021/07/25 17:51
|
||||||
|
* 功能描述:
|
||||||
|
*/
|
||||||
|
public class FileSizeUtil {
|
||||||
|
private static final String TAG=FileSizeUtil.class.getSimpleName();
|
||||||
|
|
||||||
|
public static final int SIZETYPE_B = 1;//获取文件大小单位为B的double值
|
||||||
|
public static final int SIZETYPE_KB = 2;//获取文件大小单位为KB的double值
|
||||||
|
public static final int SIZETYPE_MB = 3;//获取文件大小单位为MB的double值
|
||||||
|
public static final int SIZETYPE_GB = 4;//获取文件大小单位为GB的double值
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param @param imgPath
|
||||||
|
* @param @return 根据图片地址返回图片大小kb或者 Mb
|
||||||
|
* @return String
|
||||||
|
* @throws
|
||||||
|
* @Title: pathSize
|
||||||
|
* @add (default no)
|
||||||
|
*/
|
||||||
|
public static String pathSize(String imgPath) {
|
||||||
|
File file = new File(imgPath);
|
||||||
|
FileInputStream fis;
|
||||||
|
int fileLen = 0;
|
||||||
|
try {
|
||||||
|
fis = new FileInputStream(file);
|
||||||
|
fileLen = fis.available();
|
||||||
|
} catch (FileNotFoundException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
return String.valueOf(fileLen);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取文件指定文件的指定单位的大小
|
||||||
|
*
|
||||||
|
* @param filePath 文件路径
|
||||||
|
* @param sizeType 获取大小的类型1为B、2为KB、3为MB、4为GB
|
||||||
|
* @return double值的大小
|
||||||
|
*/
|
||||||
|
public static double getFileOrFilesSize(String filePath, int sizeType) {
|
||||||
|
File file = new File(filePath);
|
||||||
|
long blockSize = 0;
|
||||||
|
try {
|
||||||
|
if (file.isDirectory()) {
|
||||||
|
blockSize = getFileSizes(file);
|
||||||
|
} else {
|
||||||
|
blockSize = getFileSize(file);
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
// LogUtil.E(TAG,"获取文件大小失败!");
|
||||||
|
}
|
||||||
|
return FormetFileSize(blockSize, sizeType);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 调用此方法自动计算指定文件或指定文件夹的大小
|
||||||
|
*
|
||||||
|
* @param filePath 文件路径
|
||||||
|
* @return 计算好的带B、KB、MB、GB的字符串
|
||||||
|
*/
|
||||||
|
public static String getAutoFileOrFilesSize(String filePath) {
|
||||||
|
File file = new File(filePath);
|
||||||
|
long blockSize = 0;
|
||||||
|
try {
|
||||||
|
if (file.isDirectory()) {
|
||||||
|
blockSize = getFileSizes(file);
|
||||||
|
} else {
|
||||||
|
blockSize = getFileSize(file);
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
// LogUtil.E(TAG,"获取文件大小失败!");
|
||||||
|
}
|
||||||
|
return FormetFileSize(blockSize);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取指定文件大小
|
||||||
|
*
|
||||||
|
* @param file
|
||||||
|
* @return
|
||||||
|
* @throws Exception
|
||||||
|
*/
|
||||||
|
private static long getFileSize(File file) throws Exception {
|
||||||
|
long size = 0;
|
||||||
|
if (file.exists()) {
|
||||||
|
FileInputStream fis = null;
|
||||||
|
fis = new FileInputStream(file);
|
||||||
|
size = fis.available();
|
||||||
|
} else {
|
||||||
|
file.createNewFile();
|
||||||
|
// LogUtil.E(TAG,"获取文件大小不存在!");
|
||||||
|
}
|
||||||
|
return size;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取指定文件夹
|
||||||
|
*
|
||||||
|
* @param f
|
||||||
|
* @return
|
||||||
|
* @throws Exception
|
||||||
|
*/
|
||||||
|
private static long getFileSizes(File f) throws Exception {
|
||||||
|
long size = 0;
|
||||||
|
File flist[] = f.listFiles();
|
||||||
|
for (int i = 0; i < flist.length; i++) {
|
||||||
|
if (flist[i].isDirectory()) {
|
||||||
|
size = size + getFileSizes(flist[i]);
|
||||||
|
} else {
|
||||||
|
size = size + getFileSize(flist[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return size;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 转换文件大小
|
||||||
|
*
|
||||||
|
* @param fileS
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
private static String FormetFileSize(long fileS) {
|
||||||
|
DecimalFormat df = new DecimalFormat("#.00");
|
||||||
|
String fileSizeString = "";
|
||||||
|
String wrongSize = "0B";
|
||||||
|
if (fileS == 0) {
|
||||||
|
return wrongSize;
|
||||||
|
}
|
||||||
|
if (fileS < 1024) {
|
||||||
|
fileSizeString = df.format((double) fileS) + "B";
|
||||||
|
} else if (fileS < 1048576) {
|
||||||
|
fileSizeString = df.format((double) fileS / 1024) + "KB";
|
||||||
|
} else if (fileS < 1073741824) {
|
||||||
|
fileSizeString = df.format((double) fileS / 1048576) + "MB";
|
||||||
|
} else {
|
||||||
|
fileSizeString = df.format((double) fileS / 1073741824) + "GB";
|
||||||
|
}
|
||||||
|
return fileSizeString;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 转换文件大小,指定转换的类型
|
||||||
|
*
|
||||||
|
* @param fileS
|
||||||
|
* @param sizeType
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
private static double FormetFileSize(long fileS, int sizeType) {
|
||||||
|
DecimalFormat df = new DecimalFormat("#.00");
|
||||||
|
double fileSizeLong = 0;
|
||||||
|
switch (sizeType) {
|
||||||
|
case SIZETYPE_B:
|
||||||
|
fileSizeLong = Double.valueOf(df.format((double) fileS));
|
||||||
|
break;
|
||||||
|
case SIZETYPE_KB:
|
||||||
|
fileSizeLong = Double.valueOf(df.format((double) fileS / 1024));
|
||||||
|
break;
|
||||||
|
case SIZETYPE_MB:
|
||||||
|
fileSizeLong = Double.valueOf(df.format((double) fileS / 1048576));
|
||||||
|
break;
|
||||||
|
case SIZETYPE_GB:
|
||||||
|
fileSizeLong = Double.valueOf(df.format((double) fileS / 1073741824));
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return fileSizeLong;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,570 @@
|
|||||||
|
package com.ruoyi.web.test.controller;
|
||||||
|
|
||||||
|
import cn.hutool.core.io.FileUtil;
|
||||||
|
import cn.hutool.http.HttpRequest;
|
||||||
|
import cn.hutool.http.HttpResponse;
|
||||||
|
import cn.hutool.http.HttpUtil;
|
||||||
|
import cn.hutool.json.JSONArray;
|
||||||
|
import cn.hutool.json.JSONObject;
|
||||||
|
import cn.hutool.log.Log;
|
||||||
|
import cn.hutool.log.LogFactory;
|
||||||
|
import lombok.SneakyThrows;
|
||||||
|
import org.apache.commons.codec.digest.DigestUtils;
|
||||||
|
import org.apache.http.HttpEntity;
|
||||||
|
import org.apache.http.client.methods.CloseableHttpResponse;
|
||||||
|
import org.apache.http.client.methods.HttpPost;
|
||||||
|
import org.apache.http.entity.ContentType;
|
||||||
|
import org.apache.http.entity.mime.MultipartEntityBuilder;
|
||||||
|
import org.apache.http.impl.client.CloseableHttpClient;
|
||||||
|
import org.apache.http.impl.client.HttpClients;
|
||||||
|
import org.apache.http.util.EntityUtils;
|
||||||
|
import org.apache.velocity.runtime.directive.Foreach;
|
||||||
|
|
||||||
|
import java.io.*;
|
||||||
|
import java.math.BigInteger;
|
||||||
|
import java.net.HttpURLConnection;
|
||||||
|
import java.net.URL;
|
||||||
|
import java.net.URLConnection;
|
||||||
|
import java.nio.channels.FileChannel;
|
||||||
|
import java.nio.charset.StandardCharsets;
|
||||||
|
import java.security.MessageDigest;
|
||||||
|
import java.security.NoSuchAlgorithmException;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.LinkedList;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @Auther: Wang
|
||||||
|
* @Date: 2021/07/25 02:02
|
||||||
|
* 功能描述:
|
||||||
|
*/
|
||||||
|
public class FileUtilsBaidu {
|
||||||
|
|
||||||
|
private static final Log log = LogFactory.get();
|
||||||
|
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
//不能有空格
|
||||||
|
String filePath = "D:\\data\\ces\\";
|
||||||
|
String fileName = "day4_MySQL性能优化总结.zip";
|
||||||
|
System.out.println(save(filePath, fileName));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @Description: TODO 保存文件
|
||||||
|
* @param: filePath 文件路径
|
||||||
|
* @param: fileName 文件名称
|
||||||
|
* return 文件下载地址
|
||||||
|
*/
|
||||||
|
@SneakyThrows
|
||||||
|
private static String save(String filePath, String fileName) {
|
||||||
|
//本地文件地址
|
||||||
|
String absoluteFilePath = filePath + fileName;
|
||||||
|
//云端文件地址
|
||||||
|
String cloudPath = Constant.APP_PATH + fileName;
|
||||||
|
|
||||||
|
//文件分片并获取md5值
|
||||||
|
File file = new File(absoluteFilePath);
|
||||||
|
File[] separate = separate(absoluteFilePath, Constant.UNIT);
|
||||||
|
StringBuffer md5s = new StringBuffer();
|
||||||
|
if (separate.length == 1) {
|
||||||
|
md5s.append(getMD5(separate[0]));
|
||||||
|
// md5s.append(DigestUtils.md5Hex(new FileInputStream(separate[0])));
|
||||||
|
}
|
||||||
|
if (separate.length > 1) {
|
||||||
|
for (int i = 0; i < separate.length; i++) {
|
||||||
|
md5s.append(getMD5(separate[i]) + "\",\"");
|
||||||
|
// md5s.append(DigestUtils.md5Hex(new FileInputStream(separate[i])) + "\",\"");
|
||||||
|
log.info("正在分片,{}{}", separate[i].toString(), i);
|
||||||
|
}
|
||||||
|
String s = md5s.toString();
|
||||||
|
md5s = new StringBuffer(s.substring(0, md5s.length() - 3));
|
||||||
|
}
|
||||||
|
|
||||||
|
Long fileMax = file.length();
|
||||||
|
|
||||||
|
//预上传
|
||||||
|
String precreate = precreate(cloudPath,fileMax, 0, md5s.toString());
|
||||||
|
log.info("预上传{} iploadid是 {} md5{}", precreate,(String) new JSONObject(precreate).get("uploadid"),md5s.toString());
|
||||||
|
|
||||||
|
//分片上传
|
||||||
|
String upload = upload(cloudPath, (String) new JSONObject(precreate).get("uploadid"), separate);
|
||||||
|
log.info("分片上传{}", upload);
|
||||||
|
log.info(" >>>>>>>>>>>>>>>>>>>>>>>>>>");
|
||||||
|
|
||||||
|
Thread.sleep(3000);
|
||||||
|
//创建文件
|
||||||
|
|
||||||
|
log.info("创建文件 fileName{} 文件大小{} md5:{} ID:{}", fileName,FileSizeUtil.pathSize(absoluteFilePath),md5s.toString(),(String) new JSONObject(precreate).get("uploadid"));
|
||||||
|
String create = create(fileName, fileMax, 0, md5s.toString(),(String) new JSONObject(precreate).get("uploadid"));
|
||||||
|
log.info("创建文件{}", create);
|
||||||
|
|
||||||
|
//获取下载地址
|
||||||
|
String downUrl = getDownUrl(fileName);
|
||||||
|
log.info("获取下载地址{}", downUrl);
|
||||||
|
|
||||||
|
return downUrl;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @Description: TODO 获取下载地址
|
||||||
|
* @param: fileName 文件名
|
||||||
|
*/
|
||||||
|
private static String getDownUrl(String fileName) {
|
||||||
|
String fileSearch = HttpUtil.get(Constant.FILE_SEARCH + "&access_token=" + Constant.ATOKEN + "&key=" + fileName);
|
||||||
|
JSONObject jsonObject = new JSONObject(fileSearch);
|
||||||
|
JSONArray list = jsonObject.getJSONArray("list");
|
||||||
|
JSONObject listJSONObject = list.getJSONObject(0);
|
||||||
|
Long fs_id = listJSONObject.getLong("fs_id");
|
||||||
|
String url = Constant.DOWN_LOUE_URL + "?method=filemetas&access_token=" + Constant.ATOKEN + "&fsids=[" + fs_id + "]&dlink=1";
|
||||||
|
String s = HttpUtil.get(url);
|
||||||
|
JSONObject sJsonObject = new JSONObject(s);
|
||||||
|
JSONArray jsonArray = sJsonObject.getJSONArray("list");
|
||||||
|
JSONObject jsonObjectClient = jsonArray.getJSONObject(0);
|
||||||
|
String dlink = jsonObjectClient.getStr("dlink");
|
||||||
|
return dlink;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @Description: TODO 创建文件
|
||||||
|
* @param: fileName 文件名称
|
||||||
|
* @param: size 文件大小 字节
|
||||||
|
* @param: isDir 0文件 1目录(设置为目录是 size要设置为0)
|
||||||
|
* @param: blockList (文件的md5值) 可以把文件分为多个,然后分批上传
|
||||||
|
* @return: java.lang.String
|
||||||
|
*/
|
||||||
|
private static String create(String fileName, Long size, Integer isDir, String blockList, String uploadid) {
|
||||||
|
String strURL = Constant.FILE_MANAGER_URL + "?method=create&access_token=" + Constant.ATOKEN;
|
||||||
|
// String params = "path=" + Constant.APP_PATH + fileName + "&size=" + size + "&autoinit=1&block_list=[\"" + blockList + "\"]&isdir=" + isDir +"&uploadid"+uploadid;
|
||||||
|
// return open(strURL, params, "POST");
|
||||||
|
//
|
||||||
|
// //方式一
|
||||||
|
HashMap<String, Object> paramMap = new HashMap<>();
|
||||||
|
paramMap.put("path", Constant.APP_PATH + fileName);
|
||||||
|
paramMap.put("size", size);
|
||||||
|
// paramMap.put("autoinit", 1);
|
||||||
|
// paramMap.put("rtype", 1);
|
||||||
|
String str ="[\"" +blockList +"\"]";
|
||||||
|
paramMap.put("block_list", str);
|
||||||
|
paramMap.put("isdir",isDir);
|
||||||
|
paramMap.put("uploadid",uploadid);
|
||||||
|
// paramMap.put("app_id",Constant.APP_ID);
|
||||||
|
String result= HttpUtil.post(strURL, paramMap);
|
||||||
|
System.out.println("block_list :" + paramMap.get("block_list"));
|
||||||
|
System.out.println("uploadid :" + paramMap.get("uploadid"));
|
||||||
|
System.out.println("path :" + paramMap.get("path"));
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @Description: TODO 分片上传
|
||||||
|
* @param: path 上传到百度网盘的地址
|
||||||
|
* @param: uploadid 上传的id
|
||||||
|
* @param: filePath 本地文件的地址
|
||||||
|
* @return: java.lang.String
|
||||||
|
*/
|
||||||
|
private static String upload(String path, String uploadid, File[] files) {
|
||||||
|
try {
|
||||||
|
|
||||||
|
for (int i = 0; i < files.length; i++) {
|
||||||
|
String url = Constant.SLICING_UPLOAD_FILE_URL + "?method=upload" +
|
||||||
|
"&access_token=" + Constant.ATOKEN +
|
||||||
|
"&type=tmpfile&partseq=" + i +
|
||||||
|
"&path=" + getURLEncoderString(path) +
|
||||||
|
"&uploadid=" + uploadid;
|
||||||
|
log.info("files : {} path {}",files[i], path);
|
||||||
|
//方式一
|
||||||
|
// HashMap<String, Object> paramMap = new HashMap<>();
|
||||||
|
// paramMap.put("file", FileUtil.file(files[i]));
|
||||||
|
// String result= HttpUtil.post(url, paramMap);
|
||||||
|
|
||||||
|
//方式二
|
||||||
|
String result = sendFile(url, files[i]);
|
||||||
|
log.info("正在上传分片文件{}{}", result, i);
|
||||||
|
// Thread.sleep(3000);
|
||||||
|
}
|
||||||
|
|
||||||
|
return path;
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @Description: TODO 预上传
|
||||||
|
* @param: cloudPath 云端路径
|
||||||
|
* @param: size 文件大小 字节
|
||||||
|
* @param: isDir 0文件 1目录(设置为目录是 size要设置为0)
|
||||||
|
* @param: blockList (文件的md5值) 可以把文件分为多个,然后分批上传
|
||||||
|
* @return: java.lang.String
|
||||||
|
*/
|
||||||
|
private static String precreate(String cloudPath, Long size, Integer isDir, String blockList) {
|
||||||
|
String strURL = Constant.GET_READY_FILE_URL + "?method=precreate&access_token=" + Constant.ATOKEN;
|
||||||
|
String params = "path=" + getURLEncoderString(cloudPath) + "&size=" + size + "&autoinit=1&block_list=[\"" + blockList + "\"]&isdir=" + isDir;
|
||||||
|
return open(strURL, params, "POST");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @Description: TODO 获取md5值
|
||||||
|
* String path 文件地址
|
||||||
|
*/
|
||||||
|
private final static String[] strHex = {"0", "1", "2", "3", "4", "5",
|
||||||
|
"6", "7", "8", "9", "a", "b", "c", "d", "e", "f"};
|
||||||
|
|
||||||
|
private static String getMD5(File path) {
|
||||||
|
StringBuilder buffer = new StringBuilder();
|
||||||
|
try {
|
||||||
|
MessageDigest md = MessageDigest.getInstance("MD5");
|
||||||
|
byte[] b = md.digest(org.apache.commons.io.FileUtils.readFileToByteArray(path));
|
||||||
|
for (int value : b) {
|
||||||
|
int d = value;
|
||||||
|
if (d < 0) {
|
||||||
|
d += 256;
|
||||||
|
}
|
||||||
|
int d1 = d / 16;
|
||||||
|
int d2 = d % 16;
|
||||||
|
buffer.append(strHex[d1]).append(strHex[d2]);
|
||||||
|
}
|
||||||
|
return buffer.toString();
|
||||||
|
} catch (Exception e) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
// BigInteger bi = null;
|
||||||
|
// try {
|
||||||
|
// byte[] buffer = new byte[8192];
|
||||||
|
// int len = 0;
|
||||||
|
// MessageDigest md = MessageDigest.getInstance("MD5");
|
||||||
|
//
|
||||||
|
// FileInputStream fis = new FileInputStream(f);
|
||||||
|
// while ((len = fis.read(buffer)) != -1) {
|
||||||
|
// md.update(buffer, 0, len);
|
||||||
|
// }
|
||||||
|
// fis.close();
|
||||||
|
// byte[] b = md.digest();
|
||||||
|
// bi = new BigInteger(1, b);
|
||||||
|
// } catch (NoSuchAlgorithmException e) {
|
||||||
|
// e.printStackTrace();
|
||||||
|
// } catch (IOException e) {
|
||||||
|
// e.printStackTrace();
|
||||||
|
// }
|
||||||
|
// return bi.toString(16);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @Description: TODO
|
||||||
|
* @param: strURL 网址,可以是 http://aaa?bbb=1&ccc=2 拼接的
|
||||||
|
* @param: params 拼接的body参数也就是form表单的参数 ddd=1&eee=2
|
||||||
|
* @param: method 请求方式 get/post/put/delte等
|
||||||
|
* @return: java.lang.String
|
||||||
|
*/
|
||||||
|
private static String open(String strURL, String params, String method) {
|
||||||
|
try {
|
||||||
|
URL url = new URL(strURL);// 创建连接
|
||||||
|
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
|
||||||
|
connection.setDoOutput(true);
|
||||||
|
connection.setDoInput(true);
|
||||||
|
connection.setUseCaches(false);
|
||||||
|
connection.setInstanceFollowRedirects(true);
|
||||||
|
connection.setRequestMethod(method);
|
||||||
|
connection.setRequestProperty("Accept", "application/json");// 设置接收数据的格式
|
||||||
|
connection.setRequestProperty("Content-Type", "application/json");// 设置发送数据的格式
|
||||||
|
connection.connect();
|
||||||
|
OutputStreamWriter out = new OutputStreamWriter(connection.getOutputStream(), StandardCharsets.UTF_8);// utf-8编码
|
||||||
|
out.append(params);
|
||||||
|
out.flush();
|
||||||
|
out.close(); // 读取响应
|
||||||
|
int length = connection.getContentLength();// 获取长度
|
||||||
|
InputStream is = connection.getInputStream();
|
||||||
|
if (length != -1) {
|
||||||
|
byte[] data = new byte[length];
|
||||||
|
byte[] temp = new byte[512];
|
||||||
|
int readLen = 0;
|
||||||
|
int destPos = 0;
|
||||||
|
while ((readLen = is.read(temp)) > 0) {
|
||||||
|
System.arraycopy(temp, 0, data, destPos, readLen);
|
||||||
|
destPos += readLen;
|
||||||
|
}
|
||||||
|
return new String(data, StandardCharsets.UTF_8);
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 向指定 URL 发送POST方法的请求
|
||||||
|
*
|
||||||
|
* @param url 发送请求的 URL
|
||||||
|
* @param param 请求参数,请求参数应该是 name1=value1&name2=value2 的形式。
|
||||||
|
* @return 所代表远程资源的响应结果
|
||||||
|
*/
|
||||||
|
public static String sendFile(String url, String param, String file) {
|
||||||
|
if (url == null || param == null) {
|
||||||
|
return url;
|
||||||
|
}
|
||||||
|
|
||||||
|
PrintWriter out = null;
|
||||||
|
BufferedReader in = null;
|
||||||
|
String result = "";
|
||||||
|
try {
|
||||||
|
URL realUrl = new URL(url);
|
||||||
|
// 打开和URL之间的连接
|
||||||
|
URLConnection conn = realUrl.openConnection();
|
||||||
|
// 设置通用的请求属性
|
||||||
|
conn.setRequestProperty("accept", "*/*");
|
||||||
|
conn.setRequestProperty("connection", "Keep-Alive");
|
||||||
|
conn.setRequestProperty("user-agent",
|
||||||
|
"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
|
||||||
|
// 发送POST请求必须设置如下两行
|
||||||
|
conn.setDoOutput(true);
|
||||||
|
conn.setDoInput(true);
|
||||||
|
//设置链接超时时间为2秒
|
||||||
|
conn.setConnectTimeout(1000);
|
||||||
|
//设置读取超时为2秒
|
||||||
|
conn.setReadTimeout(1000);
|
||||||
|
// 获取URLConnection对象对应的输出流
|
||||||
|
out = new PrintWriter(conn.getOutputStream());
|
||||||
|
out.write(file);
|
||||||
|
// 发送请求参数
|
||||||
|
out.print(param);
|
||||||
|
// flush输出流的缓冲
|
||||||
|
out.flush();
|
||||||
|
// 定义BufferedReader输入流来读取URL的响应
|
||||||
|
in = new BufferedReader(
|
||||||
|
new InputStreamReader(conn.getInputStream()));
|
||||||
|
String line;
|
||||||
|
while ((line = in.readLine()) != null) {
|
||||||
|
result += line;
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
System.out.println(e.getMessage() + "地址:" + url);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
//使用finally块来关闭输出流、输入流
|
||||||
|
finally {
|
||||||
|
try {
|
||||||
|
if (out != null) {
|
||||||
|
out.close();
|
||||||
|
}
|
||||||
|
if (in != null) {
|
||||||
|
in.close();
|
||||||
|
}
|
||||||
|
} catch (IOException ex) {
|
||||||
|
System.out.println(ex.getMessage());
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param: filePath
|
||||||
|
* @param: unit 单个文件大小
|
||||||
|
* @return: 返回文件的目录
|
||||||
|
*/
|
||||||
|
private static File[] separate(Object obj, Integer unit) {
|
||||||
|
|
||||||
|
try {
|
||||||
|
|
||||||
|
InputStream bis = null;//输入流用于读取文件数据
|
||||||
|
OutputStream bos = null;//输出流用于输出分片文件至磁盘
|
||||||
|
File file = null;
|
||||||
|
if (obj instanceof String) {
|
||||||
|
file = new File((String) obj);
|
||||||
|
}
|
||||||
|
if (obj instanceof File) {
|
||||||
|
file = (File) obj;
|
||||||
|
}
|
||||||
|
|
||||||
|
String filePath = file.getAbsolutePath();
|
||||||
|
File newFile = new File(filePath.substring(0, filePath.lastIndexOf("\\") + 1));
|
||||||
|
String directoryPath = newFile.getAbsolutePath();
|
||||||
|
long splitSize = unit * 1024 * 1024;//单片文件大小,MB
|
||||||
|
if (file.length() < splitSize) {
|
||||||
|
log.info("文件小于单个分片大小,无需分片{}", file.length());
|
||||||
|
return new File[]{file};
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//分片二
|
||||||
|
RandomAccessFile in=null;
|
||||||
|
RandomAccessFile out =null;
|
||||||
|
long length=file.length();//文件大小
|
||||||
|
long count=length%splitSize==0?(length/splitSize):(length/splitSize+1);//文件分片数
|
||||||
|
byte[] bt=new byte[1024];
|
||||||
|
in=new RandomAccessFile(file, "r");
|
||||||
|
for (int i = 1; i <= count; i++) {
|
||||||
|
out = new RandomAccessFile(new File(filePath+"."+i), "rw");//定义一个可读可写且后缀名为.part的二进制分片文件
|
||||||
|
long begin = (i-1)*splitSize;
|
||||||
|
long end = i* splitSize;
|
||||||
|
int len=0;
|
||||||
|
in.seek(begin);
|
||||||
|
while (in.getFilePointer()<end&&-1!=(len=in.read(bt))) {
|
||||||
|
out.write(bt, 0, len);
|
||||||
|
}
|
||||||
|
out.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//分片一
|
||||||
|
// bis = new BufferedInputStream(new FileInputStream(file));
|
||||||
|
// long writeByte = 0;//已读取的字节数
|
||||||
|
// int len = 0;
|
||||||
|
// byte[] bt = new byte[1024];
|
||||||
|
// while (-1 != (len = bis.read(bt))) {
|
||||||
|
// if (writeByte % splitSize == 0) {
|
||||||
|
// if (bos != null) {
|
||||||
|
// bos.flush();
|
||||||
|
// bos.close();
|
||||||
|
// }
|
||||||
|
// bos = new BufferedOutputStream(new FileOutputStream(filePath + "." + (writeByte / splitSize + 1) + ".part"));
|
||||||
|
// }
|
||||||
|
// writeByte += len;
|
||||||
|
// bos.write(bt, 0, len);
|
||||||
|
// }
|
||||||
|
|
||||||
|
|
||||||
|
log.info("文件分片成功!");
|
||||||
|
|
||||||
|
//排除被分片的文件
|
||||||
|
if (newFile.isDirectory()) {
|
||||||
|
File[] files = newFile.listFiles();
|
||||||
|
File[] resultFiles = new File[files.length - 1];
|
||||||
|
int j = 0;
|
||||||
|
for (int i = 0; i < files.length; i++) {
|
||||||
|
if (!files[i].equals(file)) {
|
||||||
|
resultFiles[j] = files[i];
|
||||||
|
j++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return resultFiles;
|
||||||
|
}
|
||||||
|
|
||||||
|
bos.flush();
|
||||||
|
bos.close();
|
||||||
|
bis.close();
|
||||||
|
return new File[0];
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.info("文件分片失败!");
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
//splitNum:要分几片,currentDir:分片后存放的位置,subSize:按多大分片
|
||||||
|
public static File[] nioSpilt(Object object, int splitNum, String currentDir, double subSize) {
|
||||||
|
try {
|
||||||
|
File file = null;
|
||||||
|
if (object instanceof String) {
|
||||||
|
file = new File((String) object);
|
||||||
|
}
|
||||||
|
if (object instanceof String) {
|
||||||
|
file = (File) object;
|
||||||
|
}
|
||||||
|
FileInputStream fis = new FileInputStream(file);
|
||||||
|
FileChannel inputChannel = fis.getChannel();
|
||||||
|
FileOutputStream fos;
|
||||||
|
FileChannel outputChannel;
|
||||||
|
long splitSize = (long) subSize;
|
||||||
|
long startPoint = 0;
|
||||||
|
long endPoint = splitSize;
|
||||||
|
for (int i = 1; i <= splitNum; i++) {
|
||||||
|
fos = new FileOutputStream(currentDir + i);
|
||||||
|
outputChannel = fos.getChannel();
|
||||||
|
inputChannel.transferTo(startPoint, splitSize, outputChannel);
|
||||||
|
startPoint += splitSize;
|
||||||
|
endPoint += splitSize;
|
||||||
|
outputChannel.close();
|
||||||
|
fos.close();
|
||||||
|
}
|
||||||
|
inputChannel.close();
|
||||||
|
fis.close();
|
||||||
|
File newFile = new File(file.getAbsolutePath().substring(0, file.getAbsolutePath().lastIndexOf("\\") + 1));
|
||||||
|
if (newFile.isDirectory()) {
|
||||||
|
return newFile.listFiles();
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
return new File[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @Description: TODO 发送文件
|
||||||
|
* @param: url 发送地址
|
||||||
|
* @param: file 发送文件
|
||||||
|
* @return: java.lang.String
|
||||||
|
*/
|
||||||
|
public static String sendFile(String url, File file) {
|
||||||
|
try {
|
||||||
|
MultipartEntityBuilder builder = MultipartEntityBuilder.create();
|
||||||
|
builder.setContentType(ContentType.MULTIPART_FORM_DATA);
|
||||||
|
builder.addBinaryBody("file", file);
|
||||||
|
String body = "";
|
||||||
|
//创建httpclient对象
|
||||||
|
CloseableHttpClient client = HttpClients.createDefault();
|
||||||
|
//创建post方式请求对象
|
||||||
|
HttpPost httpPost = new HttpPost(url);
|
||||||
|
//设置请求参数
|
||||||
|
HttpEntity httpEntity = builder.build();
|
||||||
|
httpPost.setEntity(httpEntity);
|
||||||
|
//执行请求操作,并拿到结果(同步阻塞)
|
||||||
|
CloseableHttpResponse response = client.execute(httpPost);
|
||||||
|
//获取结果实体
|
||||||
|
HttpEntity entity = response.getEntity();
|
||||||
|
if (entity != null) {
|
||||||
|
//按指定编码转换结果实体为String类型
|
||||||
|
body = EntityUtils.toString(entity, "utf-8");
|
||||||
|
}
|
||||||
|
EntityUtils.consume(entity);
|
||||||
|
//释放链接
|
||||||
|
response.close();
|
||||||
|
return body;
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
public static String getURLEncoderString(String str) {
|
||||||
|
String result = "";
|
||||||
|
if (null == str) {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
result = java.net.URLEncoder.encode(str, "UTF-8");
|
||||||
|
} catch (UnsupportedEncodingException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String URLDecoderString(String str) {
|
||||||
|
String result = "";
|
||||||
|
if (null == str) {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
result = java.net.URLDecoder.decode(str, "UTF-8");
|
||||||
|
} catch (UnsupportedEncodingException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
@ -1,6 +1,7 @@
|
|||||||
package com.ruoyi.web.test.controller;
|
package com.ruoyi.web.test.controller;
|
||||||
|
|
||||||
import cn.hutool.core.date.DateUtil;
|
import cn.hutool.core.date.DateUtil;
|
||||||
|
import cn.hutool.http.HttpUtil;
|
||||||
import com.github.wujun234.uid.UidGenerator;
|
import com.github.wujun234.uid.UidGenerator;
|
||||||
import com.ruoyi.bookmark.service.ISqMenuService;
|
import com.ruoyi.bookmark.service.ISqMenuService;
|
||||||
import com.ruoyi.common.core.redis.RedisUtil;
|
import com.ruoyi.common.core.redis.RedisUtil;
|
||||||
@ -80,4 +81,6 @@ public class UIDTest extends BaseSpringBootTest{
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,41 @@
|
|||||||
|
package com.ruoyi.common.constant;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @Auther: Wang
|
||||||
|
* @Date: 2021/07/24 23:17
|
||||||
|
* 功能描述: 百度网盘的 请求url
|
||||||
|
*/
|
||||||
|
public class BaiduUrl {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取用户的身份信息 名称
|
||||||
|
*/
|
||||||
|
public static final String USER = "https://pan.baidu.com/rest/2.0/xpan/nas";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取容量信息
|
||||||
|
*/
|
||||||
|
public static final String CAPACITY = "https://pan.baidu.com/api/quota";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取文件列表
|
||||||
|
*/
|
||||||
|
public static final String FILE_LIST = "https://pan.baidu.com/rest/2.0/xpan/file";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取递归文件列表
|
||||||
|
*/
|
||||||
|
public static final String RECURSION = "https://pan.baidu.com/rest/2.0/xpan/multimedia";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 搜索文件
|
||||||
|
*/
|
||||||
|
public static final String FILE_NAME = "https://pan.baidu.com/rest/2.0/xpan/file";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 通过ID查询文件的详细信息
|
||||||
|
*/
|
||||||
|
public static final String FILEMETAS = "https://pan.baidu.com/rest/2.0/xpan/multimedia";
|
||||||
|
|
||||||
|
|
||||||
|
}
|
@ -79,6 +79,12 @@
|
|||||||
<groupId>com.ruoyi</groupId>
|
<groupId>com.ruoyi</groupId>
|
||||||
<artifactId>ruoyi-note</artifactId>
|
<artifactId>ruoyi-note</artifactId>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<!-- 便签模块-->
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.ruoyi</groupId>
|
||||||
|
<artifactId>yunpan-baidu</artifactId>
|
||||||
|
<version>3.0.0</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
||||||
|
@ -10,7 +10,7 @@
|
|||||||
src="https://favicon.lucq.fun/?url=https://www.baidu.com"/></div>
|
src="https://favicon.lucq.fun/?url=https://www.baidu.com"/></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="sousou-input" >
|
<div class="sousou-input" >
|
||||||
<el-input slot="reference" @keyup.enter.native="gosousuo" placeholder="请输入要查找的关键词" v-model="sousuo"
|
<el-input slot="reference" style="width: 300px;" @keyup.enter.native="gosousuo" placeholder="请输入要查找的关键词" v-model="sousuo"
|
||||||
size="small" >
|
size="small" >
|
||||||
<i slot="prefix" class="el-input__icon el-icon-search"></i>
|
<i slot="prefix" class="el-input__icon el-icon-search"></i>
|
||||||
</el-input>
|
</el-input>
|
||||||
@ -1427,8 +1427,6 @@
|
|||||||
|
|
||||||
.sousou-input {
|
.sousou-input {
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
|
||||||
justify-content: center;
|
|
||||||
width: 100%;
|
width: 100%;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
26
yunpan-baidu/pom.xml
Normal file
26
yunpan-baidu/pom.xml
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
|
<parent>
|
||||||
|
<artifactId>ruoyi</artifactId>
|
||||||
|
<groupId>com.ruoyi</groupId>
|
||||||
|
<version>3.0.0</version>
|
||||||
|
</parent>
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
|
<artifactId>yunpan-baidu</artifactId>
|
||||||
|
|
||||||
|
<description>
|
||||||
|
云盘接口
|
||||||
|
</description>
|
||||||
|
<dependencies>
|
||||||
|
|
||||||
|
<!-- 通用工具-->
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.ruoyi</groupId>
|
||||||
|
<artifactId>ruoyi-common</artifactId>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
</dependencies>
|
||||||
|
</project>
|
@ -0,0 +1,72 @@
|
|||||||
|
package com.ruoyi.baidu.servise;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @Auther: Wang
|
||||||
|
* @Date: 2021/07/24 22:33
|
||||||
|
* 功能描述:
|
||||||
|
*/
|
||||||
|
|
||||||
|
public interface BaiduWangPanServise {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @Description: 获取用户的身份信息
|
||||||
|
*
|
||||||
|
* @param access_token token令牌
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
String getUserInfo(String access_token);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @Description: 获取容量信息
|
||||||
|
*
|
||||||
|
* @param access_token token令牌
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
String getCapacity(String access_token);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @Description: 获取文件列表信息
|
||||||
|
*
|
||||||
|
* @param access_token token令牌
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
String getFileList(String access_token);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @Description: 获取文件列表信息
|
||||||
|
*
|
||||||
|
* @param access_token token令牌
|
||||||
|
* @param filePath 递归的文件夹路径 如: /myApp
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
String getFileRecursionList(String access_token,String filePath);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @Description: 搜索文件
|
||||||
|
*
|
||||||
|
* @param access_token token令牌
|
||||||
|
* @param fileName 文件名称
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
String getSouSuoFileList(String access_token,String fileName);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @Description: 通过文件ID查询文件的信息
|
||||||
|
*
|
||||||
|
* @param access_token token令牌
|
||||||
|
* @param fileId 文件ID
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
String getfilemetas(String access_token,String fileId);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,71 @@
|
|||||||
|
package com.ruoyi.baidu.servise.impl;
|
||||||
|
|
||||||
|
import cn.hutool.http.HttpUtil;
|
||||||
|
import com.ruoyi.baidu.servise.BaiduWangPanServise;
|
||||||
|
import com.ruoyi.common.constant.BaiduUrl;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @Auther: Wang
|
||||||
|
* @Date: 2021/07/24 22:34
|
||||||
|
* 功能描述: 百度网盘操作
|
||||||
|
*/
|
||||||
|
@Service
|
||||||
|
public class BaiduWangPanServiseImpl implements BaiduWangPanServise {
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getUserInfo(String access_token) {
|
||||||
|
HashMap<String, Object> paramMap = new HashMap<>();
|
||||||
|
paramMap.put("access_token", access_token);
|
||||||
|
paramMap.put("method", "uinfo");
|
||||||
|
return HttpUtil.get(BaiduUrl.USER, paramMap);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getCapacity(String access_token) {
|
||||||
|
HashMap<String, Object> paramMap = new HashMap<>();
|
||||||
|
paramMap.put("access_token", access_token);
|
||||||
|
paramMap.put("checkfree", 1);
|
||||||
|
paramMap.put("checkexpire", 1);
|
||||||
|
return HttpUtil.get(BaiduUrl.CAPACITY, paramMap);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getFileList(String access_token) {
|
||||||
|
HashMap<String, Object> paramMap = new HashMap<>();
|
||||||
|
paramMap.put("access_token", access_token);
|
||||||
|
paramMap.put("method", "list");
|
||||||
|
return HttpUtil.get(BaiduUrl.FILE_LIST, paramMap);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getFileRecursionList(String access_token,String filePath) {
|
||||||
|
HashMap<String, Object> paramMap = new HashMap<>();
|
||||||
|
paramMap.put("access_token", access_token);
|
||||||
|
paramMap.put("path", filePath);
|
||||||
|
return HttpUtil.get(BaiduUrl.RECURSION, paramMap);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getSouSuoFileList(String access_token, String fileName) {
|
||||||
|
HashMap<String, Object> paramMap = new HashMap<>();
|
||||||
|
paramMap.put("access_token", access_token);
|
||||||
|
paramMap.put("method", "search");
|
||||||
|
paramMap.put("key", "imageAi");
|
||||||
|
return HttpUtil.get(BaiduUrl.FILE_NAME, paramMap);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getfilemetas(String access_token, String fileId) {
|
||||||
|
HashMap<String, Object> paramMap = new HashMap<>();
|
||||||
|
paramMap.put("access_token", access_token);
|
||||||
|
paramMap.put("method", "filemetas");
|
||||||
|
paramMap.put("fsids", fileId);
|
||||||
|
return HttpUtil.get(BaiduUrl.FILE_NAME, paramMap);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
Reference in New Issue
Block a user