需要用到的包
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.73</version>
</dependency>
<!-- httpclient 相关依赖-->
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpcore</artifactId>
<version>4.4.10</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpclient -->
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.6</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpmime</artifactId>
<version>4.5</version>
</dependency>
后端代码以及接口见我之前发的文章:文章地址
之前的实现方式是通过html上传文件实现文件上传,而现在是基于Java实现发起http请求进行问价的上传。在本地使用Java对文件进行分片上传。
package com.dongmu.util;
import org.apache.commons.codec.digest.DigestUtils;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.math.BigInteger;
import java.nio.channels.FileChannel;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.HashMap;
import java.util.Map;
public class FileUtils {
/**
* 上传大文件到服务器
* @param path 需要上传的文件的本地路径,不包含文件名,只需要到父路径即可
* @param fileName 需要上传的文件的文件名
* @param length 上传文件时候的分片的大小,不设置默认为5M
* @throws Exception
*/
public static void uploadBigFile(String path,String fileName,Long length) throws Exception {
Long sliceLen;
if (length==null||length<=0){
sliceLen = 1024*1024*5l;
}else {
sliceLen = length;
}
String fileUrl = path + "/"+fileName;
//首先获取文件的md5的值
String md5 = DigestUtils.md5Hex(new FileInputStream(fileUrl));
File file = new File(fileUrl);
//获取文件的文件名
// String fileName = file.getName();
System.out.println("上传文件的文件名:"+fileName);
HashMap<String,String> hashMap = new HashMap<>();
hashMap.put("fileName",fileName);
hashMap.put("md5",md5);
String getResult = HttpUrlConnectionUtil.httpRequestToString("http://****/check", "GET", hashMap);
// System.out.println(getResult);
Map map = JsonUtil.JsonToMap(getResult);
if (map.get("code").equals(-1)){
// System.out.println(getResult);
System.out.println("文件已经上传到服务器,无需重复上传。");
System.out.println(map.get("msg"));
return;
}else if (map.get("code").equals(0)){
System.out.println("该文件没有上传过下面开始上传这个文件......");
System.out.println(map.get("msg"));
//对文件进行分片
FileUtils.nioSpilt(file,sliceLen);
//对分片后的文件分别进行上传
File upload = new File(file.getParent()+"/uploadTemp");
File[] files = upload.listFiles();
hashMap.put("chunks",files.length+"");
for (int i = 0; i < files.length; i++) {
hashMap.put("size",files[i].length()+"");
hashMap.put("chunk",i+1+"");
HttpClientUtils.UploadFileByHttpClient(files[i],"http://localhost:8080/proof/file/upload",null,hashMap);
System.out.println("已经上传了第"+(i+1)+"个分片。"+files[i].getName());
}
FileUtils.deleteDirFiles(path);
getResult = HttpUrlConnectionUtil.httpRequestToString