C#分块上载大数据模型到Autodesk Forge bucket,该如何做?

发布于 2022-09-04 14:17:45 字数 177 浏览 24 评论 0

按照Autodesk Forge的要求,如果是较大的模型文件,需要用分块续传的方式,这也可以避免网络中断而重新从头上载。我使用C#开发,分块上传的流程是什么样的?对于分块的最小单元有无什么要求?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

燕归巢 2022-09-11 14:17:45

Forge的Data Management API (数据管理)负责云存储内的文件的上传,下载,删除,关联以及文件夹等操作。通常一些网络应用使用直接的上载的服务,直接上传,并未考虑到如果网络性能有问题,稍大的文件将可能会上传失败,造成前面上传过的重新再来。

PUT buckets/:bucketKey/objects/:objectName

所以,一定要用断点续传的方式。一般建议2M为单元大小。

PUT buckets/:bucketKey/objects/:objectName/resumable

下面C#代码基于 Forge的 C# SDK测试工程simple-csharp

private static dynamic resumableUploadFile()
    {
        Console.WriteLine("*****开始上传文件");
        string path = FILE_PATH;
        if (!File.Exists(path))
            path = @"..\..\..\" + FILE_PATH;

        //文件总大小        
        long fileSize = new System.IO.FileInfo(path).Length;
        //单元大小。例如2M    
        long chunkSize = 2 * 1024 * 1024 ;
        //文件分块数量
        long nbChunks = (long)Math.Round(0.5 + (double)fileSize / (double)chunkSize);
        //记录一个全局response,用于下游操作
        ApiResponse<dynamic> finalRes = null ;
        using (FileStream streamReader = new FileStream(path, FileMode.Open))
        {
            //分块上传的唯一id
            string sessionId = RandomString(12);
            for (int i = 0; i < nbChunks; i++)
            {
                //某次分块文件流的起点字节位置
                long start = i * chunkSize;
                //某次分块文件流的终点字节位置(如果最后一块超过文件总大小,则取文件总大小最为终点字节位置)
                long end = Math.Min(fileSize, (i + 1) * chunkSize) - 1;

                //告知Forge此次分块的内容
                string range = "bytes " + start + "-" + end + "/" + fileSize;
                //此次分块的文件流长度
                long length = end - start + 1;

                Console.WriteLine("加载某次: " + range);

                //读取此分块的文件流
                byte[] buffer = new byte[length];
                MemoryStream memoryStream = new MemoryStream(buffer);

                int nb = streamReader.Read(buffer, 0, (int)length);
                memoryStream.Write(buffer, 0, nb);
                memoryStream.Position = 0;

                //上载到Forge的bucket中
                ApiResponse<dynamic> response = objectsApi.UploadChunkWithHttpInfo(BUCKET_KEY,
                        FILE_NAME, (int)length, range, sessionId, memoryStream,
                        "application/octet-stream"); 

                finalRes = response;

                if (response.StatusCode == 202){
                    Console.WriteLine("某分块上传结束");
                    continue;
                }
                else if(response.StatusCode == 200){
                    Console.WriteLine("最后一份文件上传成功");
                }
                else{
                    //有错误
                    Console.WriteLine(response.StatusCode);
                    break;

                } 
            } 
                   
        }
                        
        return (finalRes);
    }
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文