通过OAuth,我已经从facebook上检索了一张用户图片,但是当我尝试保存它时,会出现错误
我得到了错误
严重性代码描述项目文件行抑制状态 错误CS7036没有给出与 字符串'CopyTo(int,char [],所需的形式参数'目的地' int,int)'登录C:\ Users \ ehioz \ OneDrive \ Documents \ MEGAsync \ IT 项目\ Izevbaye \ Login \ Controllers \ AccountController.cs 364有效
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();
答案 0 :(得分:1)
您的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
逻辑就被封装并保留在您的控制器之外。
答案 1 :(得分:0)
对于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);