コード例 #1
0
        /// <summary>
        /// Загрузка файла с удаленного ресурса по Url
        /// </summary>
        /// <param name="url">Url адрес представляющий собой ссылку на загрузку файла</param>
        /// <returns>MethodResult где свойство Data хранить локальный путь к загруженному файлу</returns>
        public MethodResult DownloadFile(string url)
        {
            var result = new MethodResult()
            {
                Success = false
            };
            HttpResponseMessage response = null;
            Stream stream = null;

            try
            {
                using (HttpClientHandler handler = new HttpClientHandler())
                {
                    handler.AllowAutoRedirect = false;
                    using (HttpClient httpClient = new HttpClient(handler))
                    {
                        httpClient.Timeout = TimeSpan.FromMinutes(30);

                        using (HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Head, url))
                            using (response = httpClient.SendAsync(request).Result)
                            {
                                var location = response.Headers.Location;
                                if (location != null)
                                {
                                    response = httpClient.GetAsync(location.OriginalString).Result;
                                    stream   = response.Content.ReadAsStreamAsync().Result;
                                }
                                else
                                {
                                    stream = response.Content.ReadAsStreamAsync().Result;
                                }

                                string mediaType     = response.Content.Headers.ContentType.MediaType;
                                string directoryPath = Path.Combine(Directory.GetCurrentDirectory(), "Download");

                                if (!Directory.Exists(directoryPath))
                                {
                                    Directory.CreateDirectory(directoryPath);
                                }

                                string path = Path.Combine(directoryPath, Guid.NewGuid().ToString() + "." +
                                                           mediaType.Substring(mediaType.IndexOf('/') + 1)
                                                           );

                                using (var fs = new FileStream(path, FileMode.Create, FileAccess.Write))
                                {
                                    stream.CopyTo(fs);
                                }

                                result.Data    = path;
                                result.Success = true;
                            }
                    }
                }
            }
            catch (Exception ex)
            {
                result.Message = ex.Message;
                result.Success = false;
            }

            return(result);
        }