【发布时间】:2020-11-25 22:30:17
【问题描述】:
我正在努力将图像从客户端上传到 .Net Core 中服务器端的文件夹。我使用 Postman 检查服务器端的方法是否正常工作,并且没有任何问题,但是当我尝试从客户端上传图像时,我在服务器端收到 NullReferenceException 类型的错误:对象引用未设置为对象的实例。这是服务器端的 Post 方法:
[HttpPost]
public async Task Post(IFormFile file)
{
if (string.IsNullOrWhiteSpace(_environment.WebRootPath))
{
_environment.WebRootPath = Path.Combine(Directory.GetCurrentDirectory(), "wwwroot");
}
var uploads = Path.Combine(_environment.WebRootPath, "uploads");
//var fileName = file.FileName.Split('\\').LastOrDefault().Split('/').LastOrDefault();
if (!Directory.Exists(uploads)) Directory.CreateDirectory(uploads);
if (file.Length > 0)
{
using (var fileStream = new FileStream(Path.Combine(uploads, file.FileName), FileMode.Create))
{
await file.CopyToAsync(fileStream);
}
}
}
显然,在我检查文件长度是否大于 0 的地方抛出了该方法。在客户端我收到错误“500 内部服务器错误”,我尝试使用调试器检查究竟是哪里抛出了错误但我找不到任何可能类似于某种错误的东西。这是客户端的 API 方法:
public async Task UploadPictureAsync(MediaFile image)
{
User user = new User();
string pictureUrl = "http://10.0.2.2:5000/api/UploadPicture";
HttpContent fileStreamContent = new StreamContent(image.GetStream());
// user.Picture=GetImageStreamAsBytes(image.GetStream());
fileStreamContent.Headers.ContentDisposition = new ContentDispositionHeaderValue("form-data") {FileName=Guid.NewGuid() + ".Png",Name="image"};
fileStreamContent.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
HttpClientHandler clientHandler = new HttpClientHandler();
clientHandler.ServerCertificateCustomValidationCallback = (sender, cert, chain, sslPolicyErrors) => { return true; };
using (var client = new HttpClient(clientHandler))
{
using (var formData = new MultipartFormDataContent())
{
formData.Add(fileStreamContent);
var response = await client.PostAsync(pictureUrl, formData);
if(response.IsSuccessStatusCode)
{
var result = response.Content.ReadAsStringAsync().Result;
}
}
}
}
图片在模型中声明为字节数组:
public byte[] Picture { get; set; }
是否有人理解为什么我的 POST 方法会出现这种行为,因为服务器端可以完美运行,但是当我尝试从客户端上传图像时失败?我发现奇怪的是,当我阅读错误并查看在 Content-Type 它是“text/plain”而不是“form-data”,我试图在 MutipartFormDataContent 中设置它,如下所示:
formData.Headers.ContentType.MediaType = "multipart/form-data";
我还尝试像这样在客户端上设置 MediaTypeHeaderValue:
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/octet-stream"));
我仍然得到错误的内容类型。 我还尝试了使用 Stream 而不是 MediaFile 的不同方法,但没有任何运气,因为它甚至没有在调试器模式下达到响应的断点。任何帮助将不胜感激! :)
【问题讨论】:
-
500 是服务器错误。你需要查看你的服务器日志,看看它们能告诉你什么。
-
@Jason 谢谢你的回复。问题是没有尝试从客户端上传图像,服务器端工作完美,因为我尝试使用 Postman,所以我相信问题是在客户端。当我尝试从客户端上传错误时,它与“System.NullReferenceException:对象引用未设置为对象的实例”一起引发。 on 'file.Length >0'。为什么它会单独工作,但与客户端一起使用时会引发服务器错误?
-
您可能在客户端做错了导致服务器出现问题,但您需要首先找出 500 的原因。要么通过查看日志来做到这一点,要么如果你在本地运行你的服务器,在它接收到来自客户端的请求时对其进行调试。
-
@Jason 感谢您的建议。我将尝试找出错误的原因,如果我设法使其正常工作,我会发布答案。最好的问候! :)
-
我不会说您的服务器代码中的任何问题都会导致 500,因为没有异常处理。添加一些和一些日志记录,将帮助您更快地找到它。
标签: image api asp.net-core xamarin.forms