В настоящее время я перетаскиваю / загружаю изображения в качестве URL-адреса данных и отображаю их с этим URL-адресом. Что я сейчас пытаюсь сделать, так это отправить эти загруженные изображения на мой серверный веб-api, используя ядро ASP. Net, чтобы сохранить их в базе данных sqlite, это требование для моего приложения.
В настоящее время я преобразование URL-адреса данных в буфер массива с использованием следующего кода.
async srcToFile(context, asset) {
const files = asset[0].files.fileList;
let results = [];
for (let i = 0; i < files.length; i++) {
const file = files[i];
const data = file.data;
const name = file.name;
const mimeType = file.type;
await fetch(data)
.then(function(res) {
const r = res.arrayBuffer();
console.warn('resource ', r);
return r;
})
.then(function(buf) {
console.warn('buffer: ', [buf]);
const fileData = {data:[buf], name:name, type:mimeType};
results.push(fileData);
console.warn('results of file: ', fileData);
});
}
console.warn(results);
return results;
}
затем я помещаю его в объект данных для отправки на мой сервер через ax ios так выглядит этот объект данных
const data = {
Name: asset[0].name,
Detail: asset[0].detail,
Files: asset[0].files.fileList
};
Когда я консоль из файлов, он показывает, что в нем есть данные Arraybuffer. Но когда я отправляю его на свой сервер, похоже, что данные удаляются из вызова заголовка. Потому что, когда я смотрю на заголовок, у меня больше нет этих данных, и я не могу понять, почему это происходит.
это мой вызов ax ios.
axios.post('https://localhost:5001/api/Assets', data)
.then(res => console.log(res))
.catch(error => console.log(error));
и мой внутренний веб-контроллер api post
public async Task<ActionResult> PostAsset([FromBody] AssetSaveRequest request,[FromForm] List<IFormFile> files)
{
foreach (var file in files)
{
if (file.Length > 0)
{
using (var ms = new MemoryStream())
{
file.CopyTo(ms);
var fileBytes = ms.ToArray();
string s = Convert.ToBase64String(fileBytes);
// act on the Base64 data
}
}
}
var assetCreationDto = new AssetCreationDto(request);
//var assetCreationDto = "";
try
{
var asset = _mapper.Map<Asset>(assetCreationDto);
_context.Assets.Add(asset);
//await _context.SaveChangesAsync();
var assetDto = _mapper.Map<AssetDto>(asset);
return CreatedAtAction("GetAsset", new {assetDto.Id}, assetDto);
}
catch (DbUpdateException dbe)
{
var errorCode = ((Microsoft.Data.Sqlite.SqliteException) dbe.InnerException).SqliteErrorCode;
switch (errorCode)
{
case 19:
Console.WriteLine(((Microsoft.Data.Sqlite.SqliteException)dbe.InnerException).Message);
break;
default:
Console.WriteLine("Something went wrong");
break;
}
}
catch (Exception e)
{
Console.WriteLine(e);
throw;
}
return null;
}
То, о чем я не знаю, работает, потому что я никогда не получаю данные файла, я все равно получаю Имя и детали, которые приходят в норму.
Мне нужен совет, что мне здесь делать, чтобы заставить это работать. Я попытался преобразовать буфер массива в строку base64, но это не помогло, и мне было бы здорово помочь, и предложения были бы замечательными, чтобы вернуть меня в правильное русло с этим проектом.
ОБНОВЛЕНИЕ: Я изменил свой код srcToFile, чтобы дать мне файл, теперь я использую ax ios для отправки файла и данных на бэкэнд, работающий в это время с одним файлом, и теперь все, что я получаю в заголовке, это [объект объекта]. Я пробовал JSON .stringify для своих данных, вот так
const data = JSON.stringify({
Name: asset[0].name,
Detail: asset[0].detail,
Files: asset[0].files.fileList
});
Он преобразовывает имя и детали в строку, но стирает файл, и я ничего не получаю на бэкэнде.
У меня есть протестировал с почтальоном и сделал несколько успешных сообщений. но я не могу получить правильные данные из моего Vue внешнего интерфейса.
вот где я сейчас нахожусь. любые предложения всегда помогают