protected override Task SerializeToStreamAsync(Stream stream, TransportContext context)
        {
            return(Task.Run(async() =>
            {
                var buffer = new byte[DefaultBufferSize];

                _progress?.UploadProgress.ChangeState(UploadState.PendingUpload);

                await using (_content)
                {
                    while (true)
                    {
                        var length = await _content.ReadAsync(buffer, 0, buffer.Length);
                        if (length <= 0)
                        {
                            break;
                        }

                        await stream.WriteAsync(buffer, 0, length);

                        Uploaded += length;

                        _progress?.UploadProgress.ChangeState(UploadState.Uploading);
                        _progress?.UploadProgress.UpdateUploaded(length);
                        _progress?.OnUploadProgress();
                    }
                }

                _progress?.UploadProgress.ChangeState(UploadState.PendingResponse);
            }));
        }
Exemplo n.º 2
0
        public void UploadFile(string folderName, string fileName, Stream stream)
        {
            TestConnection();

            Progress?.UploadProgress.SetTotal(stream.Length);
            Progress?.UploadProgress.ChangeState(UploadState.PendingUpload);

            var url = CreateNestedFoldersIfNeeded(folderName);

            url += $"/{fileName}";

            var request    = CreateFtpWebRequest(url, WebRequestMethods.Ftp.UploadFile, keepAlive: true);
            var readBuffer = new byte[DefaultBufferSize];

            int count;
            var requestStream = request.GetRequestStream();

            while ((count = stream.Read(readBuffer, 0, readBuffer.Length)) != 0)
            {
                requestStream.Write(readBuffer, 0, count);

                Progress?.UploadProgress.ChangeState(UploadState.Uploading);
                Progress?.UploadProgress.UpdateUploaded(count);
                Progress?.OnUploadProgress();
            }

            requestStream.Flush();
            requestStream.Close();

            Progress?.UploadProgress.ChangeState(UploadState.PendingResponse);
            using (request.GetResponse())
            {
                Progress?.UploadProgress.ChangeState(UploadState.Done);
            }
        }