百度网盘上传文件

This commit is contained in:
WangHao 2021-07-25 21:44:44 +08:00
parent 6414758036
commit f1bf8f2df4
13 changed files with 1177 additions and 4 deletions

View File

@ -207,7 +207,7 @@
<module>ruoyi-common</module>
<module>ruoyi-yunbookmark</module>
<module>ruoyi-note</module>
<module>yunpan-baidu</module>
</modules>
<packaging>pom</packaging>

View File

@ -89,6 +89,11 @@
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpmime</artifactId>
<version>4.5.6</version>
</dependency>
</dependencies>

View File

@ -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();
}
}

View File

@ -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";
}

View File

@ -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为B2为KB3为MB4为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 计算好的带BKBMBGB的字符串
*/
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;
}
}

View File

@ -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;
}
}

View File

@ -1,6 +1,7 @@
package com.ruoyi.web.test.controller;
import cn.hutool.core.date.DateUtil;
import cn.hutool.http.HttpUtil;
import com.github.wujun234.uid.UidGenerator;
import com.ruoyi.bookmark.service.ISqMenuService;
import com.ruoyi.common.core.redis.RedisUtil;
@ -80,4 +81,6 @@ public class UIDTest extends BaseSpringBootTest{
}

View File

@ -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";
}

View File

@ -79,6 +79,12 @@
<groupId>com.ruoyi</groupId>
<artifactId>ruoyi-note</artifactId>
</dependency>
<!-- 便签模块-->
<dependency>
<groupId>com.ruoyi</groupId>
<artifactId>yunpan-baidu</artifactId>
<version>3.0.0</version>
</dependency>
</dependencies>

View File

@ -10,7 +10,7 @@
src="https://favicon.lucq.fun/?url=https://www.baidu.com"/></div>
</div>
<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" >
<i slot="prefix" class="el-input__icon el-icon-search"></i>
</el-input>
@ -1427,8 +1427,6 @@
.sousou-input {
display: flex;
align-items: center;
justify-content: center;
width: 100%;
}

26
yunpan-baidu/pom.xml Normal file
View 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>

View File

@ -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);
}

View File

@ -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);
}
}