使用HttpClient发送图像到POST WebApi并使用数据

时间:2018-12-12 10:11:39

标签: c# asp.net-web-api

我的HttpClientPostAsync发送图像。 我不太确定现在该怎么做,因为这是我的第一个REST Api,并且我还不能真正适应我在其他帖子中整理的内容。 希望你们能帮助我,并给我一个方向。

public async Task SendImage(string fullFileName, string fileName)
    {            
        var client = new HttpClient();
        client.BaseAddress = new Uri("http://x.x.x.x");

        var content = new StringContent(fullFileName, Encoding.UTF8, "image/jpg");
        HttpResponseMessage response = await client.PostAsync($"/values/file/{fileName}", content);
    }

我对POST功能有几个疑问。 首先,我可以使用PostMan成功访问它,并且fileName是正确的。

如何读取图像数据并将其写入文件?

[HttpPost("file/{fileName}")]
public void Upload(string fileName)
{        
    Debug.Write(fileName);
}

编辑:

我设置了环境,现在可以通过Internet将帖子发送到我发布的Web Api。 在我的应用程序上什么也没有发生。 现在,我只是想获得一些消息,但我没有得到。

[HttpPost("file/{fileName}")]
public HttpResponseMessage Upload(UploadedFile fileName)
{
    Debug.Write(fileName);
    if (!ModelState.IsValid)
    {

    }
    if (fileName == null)
    {

    }

    string destinationPath = Path.Combine(@"C:\", fileName.FileFullName);
    System.IO.File.WriteAllBytes(destinationPath, fileName.Data);
    HttpResponseMessage rm = new HttpResponseMessage();
    rm.StatusCode = HttpStatusCode.OK;
    return rm;
}

2 个答案:

答案 0 :(得分:0)

1。您的控制器应如下所示:

//For .net core 2.1
[HttpPost]
public IActionResult Index(List<IFormFile> files)
{
    //Do something with the files here. 
    return Ok();
}

//For previous versions

[HttpPost]
public IActionResult Index()
{
    var files = Request.Form.Files;
    //Do something with the files here. 
    return Ok();
}

2。要上传文件,您还可以使用分段内容:

        public async Task UploadImageAsync(Stream image, string fileName)
        {
            HttpContent fileStreamContent = new StreamContent(image);
            fileStreamContent.Headers.ContentDisposition = new System.Net.Http.Headers.ContentDispositionHeaderValue("form-data") { Name = "file", FileName = fileName };
            fileStreamContent.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/octet-stream");
            using (var client = new HttpClient())
            using (var formData = new MultipartFormDataContent())
            {
                formData.Add(fileStreamContent);
                var response = await client.PostAsync(url, formData);
                return response.IsSuccessStatusCode;
            }
         }

3。如果要上传大文件,则应考虑流式传输文件,您可以here

阅读

答案 1 :(得分:0)

恐怕您会恢复正常,直到尝试检索图像数据为止。

根据您的问题:

  

如何读取图像数据并将其写入文件?

您要做的就是获取文件的数据及其文件名,并将其发送到您的服务。

我将亲自在两端(客户端和服务端)创建一个UploadedFile类,并具有文件名和数据,因此:

public class UploadedFile
{
    public string FileFullName { get; set; }
    public byte[] Data { get; set; }

    public UploadedFile(string filePath)
    {
        FileFullName = Path.GetFileName(Normalize(filePath));
        Data = File.ReadAllBytes(filePath);
    }

    private string Normalize(string input)
    {
        return new string(input
                .Normalize(System.Text.NormalizationForm.FormD)
                .Replace(" ", string.Empty)
                .ToCharArray()
                .Where(c => CharUnicodeInfo.GetUnicodeCategory(c) != UnicodeCategory.NonSpacingMark)
                .ToArray());
    }
}

然后,您将需要NewtonSoft的JsonConvert,以便序列化对象并将其发送通过。

因此,现在您可以异步发送数据了:

public async Task SendDataAsync(string fullFilePath)
{
    if (!File.Exists(fullFilePath))
        throw new FileNotFoundException();
    var data = JsonConvert.SerializeObject(new UploadedFile(fullFilePath));
    using (var client = new WebClient())
    {
        client.Headers.Add(HttpRequestHeader.ContentType, "application/json");
        await client.UploadStringTaskAsync(new Uri("http://localhost:64204/api/upload/"), "POST", data);
    }
}

现在,确保在服务器端正确处理了请求。如果由于某种原因参数不匹配,则不会输入该方法(请记住,该服务也具有相同的模型/类-UploadedFile)。

在服务上,只需更改方法的参数并执行“类似”的操作即可:

[HttpPost]
public HttpResponseMessage Upload(UploadedFile file)
{
    if (!ModelState.IsValid)
        ...

    if (file == null)
        ...
    string destinationPath = Path.Combine(_whateverPath, file.FileFullName);
    File.WriteAllBytes(destinationPath, file.Data);
}

希望它可以帮助您了解做什么和实际上做错了什么。根据我的经验,我已经公开了类似的内容。

编辑:我实际上已经上传了一个示例,双方都可以使用:一个简单的.NET Core控制台应用程序,该应用程序检索文件并通过POST和基本的{{1 }}服务,带有一个简单的控制器来检索数据。两者都准备就绪,可以测试工作了!下载here

享受。