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); }
Forge的Data Management API (数据管理)负责云存储内的文件的上传,下载,删除,关联以及文件夹等操作。通常一些网络应用使用直接的上载的服务,直接上传,并未考虑到如果网络性能有问题,稍大的文件将可能会上传失败,造成前面上传过的重新再来。
所以,一定要用断点续传的方式。一般建议2M为单元大小。
下面C#代码基于 Forge的 C# SDK 的测试工程simple-csharp。