Witam serdecznie. Stworzyłem następującą akcję API. Ma ona za zadanie pobrać obraz, zapisać go na dysku i utworzyć odpowiedni wpis w bazie danych:
public class UploadDamageImageModel
{
public Guid DamageTicketId { get; set; }
}
[HttpPost]
[Route("Tickets/UploadImage")]
[Authorize(AuthenticationSchemes = "Bearer")]
public async Task<IActionResult> UploadDamageImage([FromBody] UploadDamageImageModel Model)
{
string userId = User.FindFirstValue(ClaimTypes.NameIdentifier);
ApplicationUser user = await _userManager.FindByIdAsync(userId);
if (user == null)
return Unauthorized();
var foundedTicket = await _dbContext.DamageTickets.FirstOrDefaultAsync(x => !x.IsClosed && x.ApplicationUserId == user.Id && x.Id == Model.DamageTicketId);
if (foundedTicket == null)
return NotFound();
try
{
if(Request.Form.Files == null || Request.Form.Files.Count() == 0)
return BadRequest();
var file = Request.Form.Files[0];
string wwwPath = _hostingEnvironment.WebRootPath;
string contentPath = _hostingEnvironment.ContentRootPath;
string path = Path.Combine(wwwPath, "Images", "VehicleDamageImages");
if (!Directory.Exists(path))
{
Directory.CreateDirectory(path);
}
if (file.Length == 0)
return BadRequest();
string fileName = Guid.NewGuid().ToString() + System.IO.Path.GetExtension(file.FileName);
using (FileStream stream = new FileStream(Path.Combine(path, fileName), FileMode.Create))
{
await file.CopyToAsync(stream);
}
VehicleDamageImage vehicleDamageImage = new VehicleDamageImage()
{
Id = Guid.NewGuid(),
DamageTicketId = foundedTicket.Id,
ImageName = fileName
};
await _dbContext.VehicleDamageImages.AddAsync(vehicleDamageImage);
await _dbContext.SaveChangesAsync();
return Ok(new Response());
}
catch (Exception ex)
{
return StatusCode(500, $"Internal server error: {ex}");
}
}
Następne co chciałbym zrobić:
Użytkownik w aplikacji xamarin-forms
robi zdjęcie i chciałbym za pomocą API przesłać je na serwer. Stworzyłem metodę w serwisie:
public async Task UploadVehicleDamageImage(LoginResponse loginResponse, Guid DamageTicketId, byte[] picture)
{
Debug.WriteLine("VehicleService - UploadVehicleDamageImage");
MultipartFormDataContent content = new MultipartFormDataContent();
content.Add(new ByteArrayContent(picture, 0, picture.Count()), "VehicleDamageImage", "VehicleDamageImage.jpg");
HttpClient httpClient = new HttpClient();
HttpRequestMessage httpRequestMessage = new HttpRequestMessage(HttpMethod.Post, $"{BaseUrl.Host}/api/v1/MobileAppApi/Tickets/UploadImage");
httpRequestMessage.Content = content;
httpRequestMessage.Headers.Add("Authorization", $"Bearer {loginResponse.token}");
var response = await httpClient.SendAsync(httpRequestMessage);
string responseString = await response.Content.ReadAsStringAsync();
Debug.WriteLine(responseString);
if (response.StatusCode == System.Net.HttpStatusCode.Unauthorized)
{
throw new UnauthorizedAccessException("Token autoryzacji wygasł");
}
else
if (response.IsSuccessStatusCode)
{
ResultModel result = JsonConvert.DeserializeObject<ResultModel>(responseString);
if (!result.success)
{
throw new Exception(result.error);
}
else
{
}
}
else
{
throw new Exception($"Wystąpił błąd podczas wysyłania żądania ({response.StatusCode.ToString()})");
}
}
Czy ktoś może mi podpowiedzieć jak to poprawnie zrobić? Brakuje mi pomysłów...