public static async Task <string> UploadFileAsync(this HttpClient httpClient, string url,
                                                   IDictionary <string, string> formData,
                                                   IList <string> filePaths,
                                                   FileUploadCallback callback = null)
 {
     return(await UploadFileAsync(httpClient, url, formData, DefaultEncoding, filePaths, callback).ConfigureAwait(false));
 }
 public static async Task <string> UploadFileAsync(this HttpClient httpClient, string url,
                                                   IDictionary <string, string> formData,
                                                   FileUploadCallback callback = null,
                                                   params string[] filePaths)
 {
     return(await UploadFileAsync(httpClient, url, formData, filePaths, callback).ConfigureAwait(false));
 }
        private static async Task WriteFileAsync(Encoding encoding, string key, string filePath, Stream stream,
                                                 int i, FileUploadCallback callback)
        {
            const string headerTemplate =
                "Content-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"\r\nContent-Type: application/octet-stream\r\n\r\n";
            string header = string.Format(headerTemplate, key, Path.GetFileName(filePath));

            byte[] headerBytes = encoding.GetBytes(header);

            await stream.WriteAsync(headerBytes, 0, headerBytes.Length).ConfigureAwait(false);

            byte[] buffer = new byte[4096];
            using (var fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read))
            {
                var total = fileStream.Length;
                int bytesRead;
                while ((bytesRead = fileStream.Read(buffer, 0, buffer.Length)) != 0)
                {
                    await stream.WriteAsync(buffer, 0, bytesRead).ConfigureAwait(false);

                    callback?.Invoke(i, total, fileStream.Position);
                    buffer = new byte[4096];
                }
            }
        }
Example #4
0
 public static async Task <string> UploadFileAsync(this HttpClient httpClient, string url,
                                                   FileUploadCallback callback = null,
                                                   CancellationTokenSource cts = null,
                                                   params string[] filePaths)
 {
     return(await UploadFileAsync(httpClient, url, null, filePaths, callback, cts).ConfigureAwait(false));
 }
        public static async Task <string> UploadFileAsync(this HttpClient httpClient,
                                                          string url,
                                                          IDictionary <string, string> formData,
                                                          Encoding encoding,
                                                          IList <string> filePaths,
                                                          FileUploadCallback callback = null)
        {
            var headerData = httpClient?.DefaultRequestHeaders.ToDictionary(
                k => k.Key, k => k.Value.LastOrDefault());

            return(await UploadFileAsync(url, headerData, formData, encoding, filePaths, callback).ConfigureAwait(false));
        }
Example #6
0
 public void SendFile(Client client, string path, Packet packet, FileUploadCallback sent = null, FileUploadCallback success = null, FileUploadCallback fail = null)
 {
     client.SendingPackets.Add(DownloadPacketCreator.AskDownload((int)new FileInfo(path).Length, "test", packet));
     Tasks.Add(new DownloadTask()
     {
         MainClient = client,
         FileStream = File.OpenRead(path),
         Hash       = "test",
         Sent       = sent,
         Success    = success,
         Fail       = fail
     });
 }
Example #7
0
        public static async Task <string> UploadFileAsync(this HttpClient httpClient,
                                                          string url,
                                                          IDictionary <string, string> formData,
                                                          Encoding encoding,
                                                          IList <string> filePaths,
                                                          FileUploadCallback callback = null,
                                                          CancellationTokenSource cts = null)
        {
            var headerData = httpClient?.DefaultRequestHeaders.ToDictionary(
                k => k.Key, k => k.Value.LastOrDefault());

            using (var client = new MultipartUploadClient())
            {
                return(await client.UploadFileAsync(url, headerData, formData, encoding, filePaths, callback, cts)
                       .ConfigureAwait(false));
            }
        }
        public static async Task <string> UploadFileAsync(
            string url,
            IDictionary <string, string> headerData,
            IDictionary <string, string> formData,
            Encoding encoding,
            IList <string> filePaths,
            FileUploadCallback callback)
        {
            string boundary = $"---------------------------{DateTime.Now.Ticks:x}";

            byte[] boundaryBytes = Encoding.ASCII.GetBytes($"\r\n--{boundary}\r\n");
            byte[] endBytes      = Encoding.ASCII.GetBytes($"\r\n--{boundary}--\r\n");

            var request = (HttpWebRequest)WebRequest.Create(url);

            request.SendChunked = true;
            request.AllowWriteStreamBuffering = false;
            request.ContentType = "multipart/form-data; boundary=" + boundary;
            request.Method      = "POST";
            request.KeepAlive   = true;
            request.Credentials = CredentialCache.DefaultCredentials;

            var keys = request.Headers.AllKeys;

            if (headerData != null)
            {
                foreach (var kvp in headerData)
                {
                    var key   = kvp.Key;
                    var value = kvp.Value;
                    if (keys.Contains(key))
                    {
                        request.Headers[key] = value;
                    }
                    else
                    {
                        request.Headers.Add(key, value);
                    }
                }
            }

            using (var stream = await request.GetRequestStreamAsync().ConfigureAwait(false))
            {
                //1.1 key/value
                if (formData != null)
                {
                    foreach (var key in formData.Keys)
                    {
                        await WriteBoundaryAsync(stream, boundaryBytes).ConfigureAwait(false);
                        await WriteRegularAsync(encoding, key, formData[key], stream).ConfigureAwait(false);
                    }
                }

                //1.2 file
                for (int i = 0; i < filePaths.Count; i++)
                {
                    var filePath = filePaths[i];
                    await WriteBoundaryAsync(stream, boundaryBytes).ConfigureAwait(false);
                    await WriteFileAsync(encoding, $"file{i}", filePath, stream, i, callback).ConfigureAwait(false);
                }

                //1.3 form end
                await stream.WriteAsync(endBytes, 0, endBytes.Length).ConfigureAwait(false);
            }

            //2.WebResponse
            try
            {
                using (var response = (HttpWebResponse)await request.GetResponseAsync().ConfigureAwait(false))
                    using (var responseStream = response.GetResponseStream())
                    {
                        if (responseStream == null)
                        {
                            return(null);
                        }

                        using (var sr = new StreamReader(responseStream))
                            return(await sr.ReadToEndAsync().ConfigureAwait(false));
                    }
            }
            catch (WebException e)
            {
                using (WebResponse response = e.Response)
                {
                    var httpResponse = (HttpWebResponse)response;
                    if (httpResponse.StatusCode != HttpStatusCode.BadRequest)
                    {
                        throw;
                    }
                    using (var responseStream = httpResponse.GetResponseStream())
                    {
                        if (responseStream == null)
                        {
                            throw;
                        }

                        using (var sr = new StreamReader(responseStream))
                        {
                            var text = await sr.ReadToEndAsync();

                            throw new Exception("response: " + text);
                        }
                    }
                }
            }
        }
Example #9
0
        public async Task <string> UploadFileAsync(
            string url,
            IDictionary <string, string> headerData,
            IDictionary <string, string> formData,
            Encoding encoding,
            IList <string> filePaths,
            FileUploadCallback callback,
            CancellationTokenSource cts)
        {
            if (!File.Exists(ExecutablePath))
            {
                throw new FileNotFoundException("The executable client was not found in: " + ExecutablePath);
            }
            var sb = new StringBuilder();

            sb.Append($"--uri {url} ");

            foreach (var kvp in formData)
            {
                var key   = kvp.Key;
                var value = kvp.Value;
                sb.Append($"--header {key}:{value} ");
            }

            foreach (var kvp in formData)
            {
                var key   = kvp.Key;
                var value = kvp.Value;
                sb.Append($"--form {key}:{value} ");
            }

            foreach (var filePath in filePaths)
            {
                var fixedFilePath = filePath.Contains(" ")
                    ? $"\"{filePath}\""
                    : filePath;
                sb.Append($"--file {fixedFilePath} ");
            }

            string arguments = sb.ToString();

            CancelPreviousTask();
            _proc = new Process
            {
                EnableRaisingEvents = true,
                StartInfo           = new ProcessStartInfo
                {
                    FileName               = ExecutablePath,
                    Arguments              = arguments,
                    CreateNoWindow         = true,
                    UseShellExecute        = false,
                    RedirectStandardOutput = true,
                    RedirectStandardError  = true,
                    WindowStyle            = ProcessWindowStyle.Hidden,
                }
            };

            string errMsg        = null;
            bool   isResultReady = false;
            var    resultSb      = new StringBuilder();

            _proc.OutputDataReceived += Proc_OutputDataReceived;
            _proc.ErrorDataReceived  += Proc_ErrorDataReceived;
            _proc.Start();
            _proc.BeginErrorReadLine();
            _proc.BeginOutputReadLine();
            try
            {
                await _proc.WaitForExitAsync(cts.Token);
            }
            catch (TaskCanceledException ex)
            {
                Console.WriteLine("Canceled task: " + ex.Message);
                CancelPreviousTask();
                throw;
            }

            if (errMsg != null)
            {
                throw new Exception(errMsg);
            }

            void Proc_OutputDataReceived(object obj, DataReceivedEventArgs args)
            {
                var uploadingFlag = "uploading: ";

                if (args.Data?.StartsWith(uploadingFlag) == true)
                {
                    var len   = uploadingFlag.Length;
                    var data  = args.Data.Substring(len);
                    var split = data.Split(';')
                                .Select(k => k.Split('=')[1])
                                .ToArray();
                    var current      = long.Parse(split[0]);
                    var total        = long.Parse(split[1]);
                    var floatPercent = double.Parse(split[2].TrimEnd('%', ' ')) / 100;
                    callback?.Invoke(total, current);
                }
                else if (args.Data == "finished")
                {
                    isResultReady = true;
                }
                else if (isResultReady)
                {
                    resultSb.AppendLine(args.Data);
                }

                Console.WriteLine(args.Data);
            }

            void Proc_ErrorDataReceived(object obj, DataReceivedEventArgs args)
            {
                if (errMsg == null)
                {
                    var errorFlag    = "error: ";
                    var responseFlag = "response: ";
                    if (args.Data?.StartsWith(errorFlag) == true)
                    {
                        var data = args.Data.Substring(errorFlag.Length);
                        if (data?.StartsWith(responseFlag) == true)
                        {
                            var data2 = data.Substring(responseFlag.Length);
                            var jsonc = JsonConvert.DeserializeObject <ResponseDataBase <object> >(data2);
                            errMsg = jsonc.Message;
                        }
                        else
                        {
                            errMsg = data;
                        }
                    }
                }
            }

            return(resultSb.ToString());
        }