Esempio n. 1
0
 void SetProgressEventArgs(ProgressUpload progressUpload, bool done)
 {
     if (OnSending != null)
     {
         var args = new EventProgressArgs()
         {
             Done = done, ProgressInfo = progressUpload
         };
         OnSending(this, args);
     }
 }
Esempio n. 2
0
        public async Task UploadChunkObject(string bucketKey, OSSFile file)
        {
            FileStream data      = File.OpenRead(file.Path);
            var        length    = data.Length;
            string     objectKey = file.Name;

            if (await this.GetBucketObject(bucketKey, objectKey) != null)
            {
                await this.DeleteObject(bucketKey, objectKey);
            }

            string sessionId = "SI" + Path.GetFileNameWithoutExtension(objectKey) + length;

            ObjectsApi api = new ObjectsApi();

            api.Configuration.AccessToken = this.token.AccessToken;

            int chunkSize = 5 * 1024 * 1024;

            long chunkCount = (long)Math.Round(0.5 + ((double)length / (double)chunkSize));

            long dataWrited = 0;

            for (int i = 0; i < chunkCount; i++)
            {
                long startByte = i * chunkSize;

                long next = (i + 1) * chunkSize;

                if (next > length)
                {
                    next = length - 1;
                }
                else
                {
                    next--;
                }

                long byteLength = next - startByte + 1;

                string bytesRange = string.Format("bytes {0}-{1}/{2}", startByte, next, length);
                byte[] buffer     = new byte[byteLength];

                data.Read(buffer, 0, (int)byteLength);
                MemoryStream ms = new MemoryStream(buffer);
                ms.Write(buffer, 0, (int)byteLength);
                ms.Position = 0;

                var response = await api.UploadChunkAsyncWithHttpInfo(bucketKey, objectKey, (int)byteLength, bytesRange, sessionId, ms);

                dataWrited += byteLength;

                double progress = (double)(100 * decimal.Ceiling(dataWrited) / decimal.Ceiling(length));

                if (response.StatusCode == 202)
                {
                    ProgressUpload?.Invoke(false, file, Convert.ToInt32(progress));
                }
                else if (response.StatusCode == 200)
                {
                    Upload?.Invoke(true, file);
                    break;
                }
                else
                {
                    ErrorOccurred("Error occurred while uploading...\nCode: " + response.StatusCode);
                    break;
                }
            }
            data.Close();
        }