.NET Core эквивалент Uint8ClampedArray
Я использую библиотеку jpeg_camera, чтобы получить снимок из моего веб-приложения на моем ноутбуке и, путем вызова выборки, отправить его на мой контроллер.
snapshot.get_image_data
возвращает объект с 3 свойствами (данные: Uint8ClampedArray, width, heigh).
Когда я делаю вызов sendPic(data)
Я всегда получаю 400 Ошибка, потому что ModelState
не является действительным.
Это означает Byte[]
не хорошо для Uint8ClampedArray
от JS.
Что является эквивалентом для этого объекта?
Я нашел также метод, который возвращает base64, и я могу преобразовать его внутри контроллера в Byte[]
но я бы хотел избежать этого решения.
код JS:
function savePic() {
var test1 = snapshot.get_image_data((done) => {
var data = {
"Pic": done.data,
"IdActivity": idActivity,
"Instant": new Date().toISOString()
};
sendPic(data);
});
}
function sendPic(data) {
fetch(uriPicsEndPoint, {
body: JSON.stringify(data),
headers: {
"Content-Type": "application/json; charset=utf-8"
},
credentials: 'include',
method: 'POST'
});
}
Контроллер API:
[Authorize]
[HttpPost]
public async Task<IActionResult> SavePic([FromBody] Selfie selfie)
{
if (ModelState.IsValid)
{
try
{
var storageAccount = CloudStorageAccount.Parse(_configuration["ConnectionStrings:Storage"]);
var blobClient = storageAccount.CreateCloudBlobClient();
var camerasContainer = blobClient.GetContainerReference("selfies");
await camerasContainer.CreateIfNotExistsAsync();
var id = Guid.NewGuid();
var fileExtension = ".jpeg";
var blobName = $"{selfie.IdActivity}/{id}{fileExtension}";
var blobRef = camerasContainer.GetBlockBlobReference(blobName);
await blobRef.UploadFromByteArrayAsync(selfie.Pic, 0, selfie.Pic.Length);
string sas = blobRef.GetSharedAccessSignature(
new SharedAccessBlobPolicy()
{
Permissions = SharedAccessBlobPermissions.Read
});
var blobUri = $"{blobRef.Uri.AbsoluteUri}{sas}";
var notification = new UpdateSelfieRequest()
{
UriPic = blobUri,
IdActivity = selfie.IdActivity,
Instant = selfie.Instant
};
string serviceBusConnectionString = _configuration["ConnectionStrings:ServiceBus"];
string queueName = _configuration["ServiceBusQueueName"];
IQueueClient queueClient = new QueueClient(serviceBusConnectionString, queueName);
var messageBody = JsonConvert.SerializeObject(notification);
var message = new Message(Encoding.UTF8.GetBytes(messageBody));
await queueClient.SendAsync(message);
await queueClient.CloseAsync();
return Ok();
}
catch
{
return StatusCode(500);
}
}
else
{
return BadRequest();
}
}
И КЛАСС "Селфи":
public class Selfie
{
public Byte[] Pic { get; set; }
public int IdActivity { get; set; }
public DateTime Instant { get; set; }
}
1 ответ
Когда вы используете stringify, он становится {"0":255, "1":0, "2":0, "3":255, ...}
в JSON.
Если у вас есть параметр действия, определенный как JObject selfie
Вы можете получить байты, используя var pic = selfie["Pic"].ToObject<Dictionary<int, byte>>()
,
В качестве альтернативы вы можете опубликовать данные в виде значений формы и определить действие как SavePic(Dictionary<int, byte> Pic, int IdActivity, DateTime Instant)
используя следующий код в браузере для тестирования:
var ctx = document.createElement('canvas').getContext('2d');
ctx.fillStyle = 'red';
ctx.fillRect(5, 5, 5, 5);
$.post('SavePic', {
Pic: ctx.getImageData(5, 5, 5, 5).data,
IdActivity: 1,
Instant: new Date().toISOString()
});
Однако может быть проще преобразовать Uint8ClampedArray в обычный массив перед публикацией данных.