我的HttpClient
用PostAsync
发送图像。
我不太确定现在该怎么做,因为这是我的第一个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;
}
答案 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。
享受。