Не могу сохранить изображение в ядре asp.net, используя CopyTo (Datastream) - PullRequest
0 голосов
/ 28 января 2019

через OAuth, я получил пользовательское изображение из Facebook, но когда я пытаюсь сохранить его, оно выдает ошибки

Я получаю ошибку

Код серьезности Описание Файл проектаОшибка состояния подавления строки CS7036 Не указан аргумент, соответствующий необходимому формальному параметру 'destination' строки 'string.CopyTo (int, char [], int, int)' Login C: \ Users \ ehioz \ OneDrive \ Documents \ MEGAsync\ ИТ-проекты \ Изевбае \ Логин \ Контроллеры \ AccountController.cs 364 Актив

1007
string pic = infos.Principal.FindFirstValue(ClaimTypes.NameIdentifier);
var pictures = $"https://graph.facebook.com/{pic}/picture?type=large";              
string path = he.WebRootPath + "/OAuth/users/" + infos+"/"+pic + "/";
Directory.CreateDirectory(path);

var fileName = Path.Combine(path, Path.GetFileName(pictures));
var DestinationStream = new FileStream(fileName, FileMode.Create);
pictures.CopyTo(DestinationStream); 
//System.IO.File.Move(sourceFile, destinationFile);

DestinationStream.Flush();
DestinationStream.Dispose();

Ответы [ 2 ]

0 голосов
/ 29 января 2019

Для WebClient.DownloadFile , он поддерживает .Net Core 2.2 2.1 2.0, вы можете попробовать просто ниже:

string picture = @"https://i.stack.imgur.com/uf6qO.jpg?s=64&g=1";
string path = _hosting.WebRootPath + "/OAuth/users/";
var fileName = Path.Combine(path, "test.jpg");
Directory.CreateDirectory(path);
WebClient client = new WebClient();
client.DownloadFile(new Uri(picture), fileName);
0 голосов
/ 28 января 2019

Ваша переменная pictures - это просто строка.Тот факт, что эта строка является URL, не имеет смысла.Он не собирается автоматически получать данные изображения для вас;это просто строкаВам нужно будет сделать запрос на изображение через HttpClient:

using (var response = await _httpClient.GetAsync(pictures))
{
    if (response.IsSuccessStatus && response.Content != null)
    {
        await response.Content.CopyToAsync(DestinationStream);
    }
}

Если получить экземпляр HttpClient для работы с ходами, это может быть так просто, как просто var _httpClient = new HttpClient();,Однако создание слишком большого количества экземпляров HttpClient может привести к исчерпанию пула соединений, поэтому предпочтительно использовать одноэлементный или заводской шаблон.В состав ASP.NET Core 2+ встроен IHttpClientFactory, который можно использовать для создания и извлечения HttpClient экземпляров, так что вместо этого вы должны внедрить и использовать его.Вы также можете (в зависимости от того, где находится этот код) напрямую внедрить HttpClient и определить экземпляр, который нужно внедрить для определенного типа в вашем Startup.cs:

services.AddHttpClient<MyImageFetchingClass>();

Это не сработает изкоробка с вещами как контроллеры, хотя, потому что контроллеры не зарегистрированы как сервисы.Хотя вы можете изменить это, предпочтительно использовать промежуточный тип.Вы вводите HttpClient в этот тип, а затем вводите этот тип в свой контроллер.Таким образом, логика HttpClient инкапсулируется и хранится вне вашего контроллера.

...