Exemplo n.º 1
0
        /// <summary>
        /// Downloads a file by file id from Backblaze B2 Cloud Storage.
        /// </summary>
        /// <param name="fileId">The unique id of the file to download.</param>
        /// <param name="localPath">The relative or absolute path to the file. This string is not case-sensitive.</param>
        /// <param name="progress">A progress action which fires every time the write buffer is cycled.</param>
        /// <param name="cancel">The cancellation token to cancel operation.</param>
        /// <exception cref="AuthenticationException">Thrown when authentication fails.</exception>
        /// <exception cref="InvalidHashException">Thrown when a checksum hash is not valid.</exception>
        /// <exception cref="ApiException">Thrown when an error occurs during client operation.</exception>
        async Task <IApiResults <DownloadFileResponse> > IStorageFiles.DownloadByIdAsync
            (string fileId, string localPath, IProgress <ICopyProgress> progress, CancellationToken cancel)
        {
            if (!Directory.Exists(Path.GetDirectoryName(localPath)))
            {
                Directory.CreateDirectory(Path.GetDirectoryName(localPath));
            }

            using (var content = File.Create(localPath))
            {
                var request = new DownloadFileByIdRequest(fileId);
                var results = await _client.DownloadByIdAsync(request, content, progress, cancel);

                if (results.IsSuccessStatusCode)
                {
                    var lastModified = results.Response.FileInfo.GetLastModified();
                    if (lastModified != DateTime.MinValue)
                    {
                        File.SetLastWriteTime(localPath, lastModified);
                    }
                }

                return(results);
            }
        }
Exemplo n.º 2
0
        /// <summary>
        /// Download a specific version of content by file id from Backblaze B2 Cloud Storage.
        /// </summary>
        /// <param name="fileId">The unique id of the file to download.</param>
        /// <param name="content">The download content to receive.</param>
        /// <exception cref="AuthenticationException">Thrown when authentication fails.</exception>
        /// <exception cref="CapExceededExecption">Thrown when a cap is exceeded or an account in bad standing.</exception>
        /// <exception cref="InvalidHashException">Thrown when a checksum hash is not valid.</exception>
        /// <exception cref="ApiException">Thrown when an error occurs during client operation.</exception>
        public async Task <IApiResults <DownloadFileResponse> > DownloadByIdAsync
            (string fileId, Stream content)
        {
            var request = new DownloadFileByIdRequest(fileId);

            return(await DownloadByIdAsync(request, content, null, _cancellationToken).ConfigureAwait(false));
        }
 /// <summary>
 /// Sets content disposition header.
 /// </summary>
 /// <param name="headers">The http content request header.</param>
 /// <param name="request">The <see cref="DownloadFileByIdRequest"/>.</param>
 public static void SetContentDisposition(this HttpContentHeaders headers, DownloadFileByIdRequest request)
 {
     if (request.ContentDisposition != null)
     {
         headers.ContentDisposition = request.ContentDisposition;
     }
 }
Exemplo n.º 4
0
        public async Task DownloadAsync_ById()
        {
            var    fileSystem = new MockFileSystem();
            string fileSha1   = string.Empty;

            int progressCounter = 0;

            TimeSpan transferTime     = TimeSpan.Zero;
            long     bytesPerSecond   = 0;
            long     bytesTransferred = 0;
            long     expectedBytes    = 0;
            double   percentComplete  = 0;

            var progress = new NaiveProgress <ICopyProgress>(x =>
            {
                progressCounter++;

                transferTime     = x.TransferTime;
                bytesPerSecond   = x.BytesPerSecond;
                bytesTransferred = x.BytesTransferred;
                expectedBytes    = x.ExpectedBytes;
                percentComplete  = x.PercentComplete;
            });

            using (var content = fileSystem.File.Create(_fileName))
            {
                var request = new DownloadFileByIdRequest(_fileId);
                var results = await Storage.DownloadByIdAsync(request, content, progress, CancellationToken.None);

                if (results.IsSuccessStatusCode)
                {
                    fileSha1 = results.Response.ContentSha1;
                }
            }

            var downloadSha1 = fileSystem.File.OpenRead(_fileName).ToSha1();

            if (!downloadSha1.Equals(fileSha1))
            {
                throw new InvalidOperationException();
            }

            Assert.Single(fileSystem.AllFiles);
            Assert.True(progressCounter > 0);
            Assert.True(transferTime > TimeSpan.Zero);
            Assert.True(bytesPerSecond > 0);
            Assert.Equal(524288, bytesTransferred);
            Assert.Equal(524288, expectedBytes);
            Assert.Equal(1, percentComplete);
        }
Exemplo n.º 5
0
        /// <summary>
        /// Downloads a specific version of content by file id.
        /// </summary>
        /// <param name="request">The <see cref="DownloadFileByIdRequest"/> to send.</param>
        /// <param name="content">The download content to receive.</param>
        /// <param name="progress">A progress action which fires every time the write buffer is cycled.</param>
        /// <param name="cancel">The cancellation token to cancel operation.</param>
        public async Task <IApiResults <DownloadFileResponse> > DownloadByIdAsync
            (DownloadFileByIdRequest request, Stream content, IProgress <ICopyProgress> progress, CancellationToken cancel)
        {
            return(await _policy.InvokeDownload.ExecuteAsync(async() =>
            {
                var fileRequest = new DownloadFileByIdRequest(request.FileId);
                var fileResults = await DownloadFileByIdAsync(fileRequest, cancel).ConfigureAwait(false);
                if (fileResults.IsSuccessStatusCode)
                {
                    if (fileResults.Response.ContentLength < Options.DownloadCutoffSize)
                    {
                        return await DownloadFileByIdAsync(request, content, progress, cancel).ConfigureAwait(false);
                    }
                    else
                    {
                        return await DownloadLargeFileAsync(fileRequest, fileResults, content, progress, cancel).ConfigureAwait(false);
                    }
                }

                return fileResults;
            }).ConfigureAwait(false));
        }
Exemplo n.º 6
0
        /// <summary>
        /// Downloads the most recent version of a large file in chunked parts.
        /// </summary>
        /// <param name="request">The <see cref="DownloadFileByIdRequest"/> content to send.</param>
        /// <param name="results">The <see cref="DownloadFileResponse"/> results.</param>
        /// <param name="content">The download content to receive.</param>
        /// <param name="progress">A progress action which fires every time the write buffer is cycled.</param>
        /// <param name="cancellationToken">The cancellation token to cancel operation.</param>
        private async Task <IApiResults <DownloadFileResponse> > DownloadLargeFileAsync
            (DownloadFileByIdRequest request, IApiResults <DownloadFileResponse> results, Stream content, IProgress <ICopyProgress> progress, CancellationToken cancellationToken)
        {
            var parts = GetContentParts(results.Response.ContentLength, Options.DownloadPartSize);

            foreach (var part in parts)
            {
                var mmultiStream = new MultiStream(content, part.Position, part.Length);
                var partReqeust  = new DownloadFileByIdRequest(request.FileId)
                {
                    Range = new RangeHeaderValue(part.Position, part.Position + part.Length - 1)
                };

                var partResults = await DownloadFileByIdAsync(partReqeust, mmultiStream, progress, cancellationToken).ConfigureAwait(false);

                if (!partResults.IsSuccessStatusCode)
                {
                    return(new ApiResults <DownloadFileResponse>(partResults.HttpResponse, partResults.Error));
                }
            }

            return(results);
        }
Exemplo n.º 7
0
 /// <summary>
 /// Downloads a specific version of a file by file id.
 /// </summary>
 /// <param name="request">The <see cref="DownloadFileByIdRequest"/> to send.</param>
 /// <param name="content">The download content to receive.</param>
 /// <param name="progress">A progress action which fires every time the write buffer is cycled.</param>
 /// <exception cref="AuthenticationException">Thrown when authentication fails.</exception>
 /// <exception cref="InvalidHashException">Thrown when a checksum hash is not valid.</exception>
 /// <exception cref="ApiException">Thrown when an error occurs during client operation.</exception>
 async Task <IApiResults <DownloadFileResponse> > IStorageFiles.DownloadAsync
     (DownloadFileByIdRequest request, Stream content, IProgress <ICopyProgress> progress)
 {
     return(await _client.DownloadFileByIdAsync(request, content, progress, _cancellationToken));
 }
Exemplo n.º 8
0
 /// <summary>
 /// Download a specific version of content by file id from Backblaze B2 Cloud Storage.
 /// </summary>
 /// <param name="request">The <see cref="DownloadFileByIdRequest"/> to send.</param>
 /// <param name="content">The download content to receive.</param>
 /// <param name="progress">A progress action which fires every time the write buffer is cycled.</param>
 /// <param name="cancel">The cancellation token to cancel operation.</param>
 /// <exception cref="AuthenticationException">Thrown when authentication fails.</exception>
 /// <exception cref="CapExceededExecption">Thrown when a cap is exceeded or an account in bad standing.</exception>
 /// <exception cref="InvalidHashException">Thrown when a checksum hash is not valid.</exception>
 /// <exception cref="ApiException">Thrown when an error occurs during client operation.</exception>
 public async Task <IApiResults <DownloadFileResponse> > DownloadByIdAsync
     (DownloadFileByIdRequest request, Stream content, IProgress <ICopyProgress> progress, CancellationToken cancel)
 {
     return(await _client.DownloadByIdAsync(request, content, progress, cancel).ConfigureAwait(false));
 }
        public DownloadFileResponse Get(DownloadFileByIdRequest request)
        {
            Console.WriteLine("In DownloadFileByIdRequest");
            byte[] fb = new byte[0];

            string sFilePath = string.Format("../StaticFiles/{0}/{1}", request.SolnId, request.FileDetails.FileRefId);

            MemoryStream ms = null;

            DownloadFileResponse dfs = new DownloadFileResponse();

            try
            {
                if (!System.IO.File.Exists(sFilePath))
                {
                    EbFileCategory category = request.FileDetails.FileCategory;

                    string Qry = this.EbConnectionFactory.DataDB.EB_DOWNLOAD_FILE_BY_ID;

                    DbParameter[] parameters =
                    {
                        this.EbConnectionFactory.DataDB.GetNewParameter("fileref", EbDbTypes.Int32, request.FileDetails.FileRefId),
                    };

                    EbDataTable t = this.EbConnectionFactory.DataDB.DoQuery(Qry, parameters);
                    if (t.Rows.Count > 0)
                    {
                        request.FileDetails.FileStoreId = t.Rows[0]["filestore_sid"].ToString();
                        request.FileDetails.InfraConID  = Convert.ToInt32(t.Rows[0]["filedb_con_id"]);
                    }
                    else
                    {
                        throw new Exception("File Not Found in Database , fileref = " + request.FileDetails.FileRefId);
                    }

                    fb = this.EbConnectionFactory.FilesDB.DownloadFileById(request.FileDetails.FileStoreId, category, request.FileDetails.InfraConID);

                    if (fb != null)
                    {
                        EbFile.Bytea_ToFile(fb, sFilePath);
                    }
                }

                if (File.Exists(sFilePath))
                {
                    ms = new MemoryStream(File.ReadAllBytes(sFilePath));

                    dfs.StreamWrapper = new MemorystreamWrapper(ms);
                    dfs.FileDetails   = new FileMeta
                    {
                        FileName           = request.FileDetails.FileName,
                        FileType           = request.FileDetails.FileType,
                        Length             = request.FileDetails.Length,
                        FileStoreId        = request.FileDetails.FileStoreId,
                        UploadDateTime     = request.FileDetails.UploadDateTime,
                        MetaDataDictionary = (request.FileDetails.MetaDataDictionary != null) ? request.FileDetails.MetaDataDictionary : new Dictionary <String, List <string> >()
                        {
                        },
                    };
                }
                else
                {
                    throw new Exception("File Not Found");
                }
            }
            catch (FormatException e)
            {
                Console.WriteLine("ObjectId not in Correct Format: " + request.FileDetails.FileName);
                Console.WriteLine("Exception: " + e.ToString());
            }
            catch (Exception e)
            {
                Log.Info("Exception:" + e.ToString());
            }

            return(dfs);
        }