首页 > 解决方案 > 在服务器 ASP.NET Core 上上传图像时出现客户端错误

问题描述

我正在努力将图像从客户端上传到.Net Core中服务器端的文件夹。我使用邮递员检查服务器端的方法是否正常工作并且没有任何问题,但是当我尝试从客户端上传图像,我在服务器端收到 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 internal server error”,我尝试使用调试器检查确切抛出错误的位置,但我可以'找不到任何可能类似于某种错误的东西。这是客户端的 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 方法有这种行为,因为服务器端工作正常,但是当我尝试从客户端上传图像时失败?我觉得奇怪的是,当我阅读错误并查看内容时- 键入它是“text/plain”而不是“form-data”,我试图在 MutipartFormDataContent 中设置它,如下所示:

formData.Headers.ContentType.MediaType = "multipart/form-data"; 

我还尝试在客户端上设置 MediaTypeHeaderValue,如下所示:

 client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/octet-stream"));

我仍然得到错误的内容类型。我还尝试了使用 Stream 而不是 MediaFile 的不同方法,但没有任何运气,因为它甚至没有在调试器模式下达到响应的断点。任何帮助将不胜感激!:)

标签: imageapiasp.net-corexamarin.forms

解决方案


我终于找到答案了!!!问题出在客户端,正如我猜想的那样,这完全是关于正确的名称。事实证明,因为在服务器端我有 IFormFile文件,我必须更改客户端以使用参数名称“文件”而不是图像,以便它可以工作。谢谢@Jason 的建议,因为我从一开始就没有理解错误并在服务器上进行了一些调试-一边帮我弄清楚。


推荐阅读