小于2G上传代码:
private IEnumerator UploadFileCoroutine(string filePath)
{
// 读取文件的二进制数据
byte[] fileData = File.ReadAllBytes(filePath);
// 创建请求对象
WWWForm form = new WWWForm();
//服务器上传方法名 ,二进制数据 ,文件名称
form.AddBinaryData("xyzfiles", fileData, Path.GetFileName(filePath));
// 发送上传文件的请求
using (UnityWebRequest www = UnityWebRequest.Post(serverUrl, form))
{
yield return www.SendWebRequest();
if (www.isNetworkError || www.isHttpError)
{
Debug.LogError("文件上传失败: " + www.error);
}
else
{
Debug.Log("文件上传成功");
}
}
}
超过2G原理很简单 就是分块上传
第一步将文件进行分块处理
代码:
/// <summary>
/// 将超过2G的文件超分成多份
/// </summary>
/// <param name="filePath"></param>
/// <param name="chunkSize"></param>
/// <returns></returns>
public byte[][] SplitFileToBytes(string filePath, int chunkSize)
{
byte[][] fileChunks;
using (FileStream fileStream = new FileStream(filePath, FileMode.Open))
{
int numChunks = (int)Math.Ceiling((double)fileStream.Length / chunkSize);
fileChunks = new byte[numChunks][];
for (int i = 0; i < numChunks; i++)
{
int bytesToRead = (i < numChunks - 1) ? chunkSize : (int)(fileStream.Length - (long)i * chunkSize);
fileChunks[i] = new byte[bytesToRead];
fileStream.Read(fileChunks[i], 0, bytesToRead);
}
}
return fileChunks;
}
上传代码需要前后端配合 后端需要将分块文件缓存整合成一个文件
前端上传代码:
/// <summary>
/// 分块上传
/// </summary>
/// <param name="filePath"></param>
/// <returns></returns>
IEnumerator UploadChunks(string filePath)
{
byte[][] fileData = SplitFileToBytes(filePath, 2 * 1024 * 1024);
int bytesRead = 0;
int totalBytesRead = 0;
foreach (byte[] chunkData in fileData)
{
yield return UploadChunk(chunkData, filePath);
totalBytesRead += bytesRead;
// 更新进度
float progress = (float)totalBytesRead / chunkData.Length;
UpdateProgress(progress);
}
}
IEnumerator UploadChunk(byte[] chunkData, string filePath)
{
// 创建请求对象
WWWForm form = new WWWForm();
form.AddBinaryData("xyzfiles", chunkData, Path.GetFileName(filePath));
// 发送上传文件的请求
using (UnityWebRequest www = UnityWebRequest.Post(serverUrl, form))
{
yield return www.SendWebRequest();
if (www.isNetworkError || www.isHttpError)
{
Debug.LogError("文件上传失败: " + www.error);
}
else
{
Debug.Log("文件上传成功");
}
}
}
void UpdateProgress(float progress)
{
// 在此处编写更新进度的代码
}
void FinishUpload()
{
// 在此处编写上传完成的代码
}