unity 上传文件 以及超2G文件上传

小于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()
    {
        // 在此处编写上传完成的代码
    }

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值