Как преобразовать файл в байтовый массив напрямую без его пути (без сохранения файла)
Вот мой код:
public async Task<IActionResult> Index(ICollection<IFormFile> files)
{
foreach (var file in files)
uploaddb(file);
var uploads = Path.Combine(_environment.WebRootPath, "uploads");
foreach (var file in files)
{
if (file.Length > 0)
{
var fileName = ContentDispositionHeaderValue.Parse(file.ContentDisposition).FileName.Trim('"');
await file.SaveAsAsync(Path.Combine(uploads, fileName));
}
Теперь я преобразую этот файл в байтовый массив, используя следующий код:
var filepath = Path.Combine(_environment.WebRootPath, "uploads/Book1.xlsx");
byte[] fileBytes = System.IO.File.ReadAllBytes(filepath);
string s = Convert.ToBase64String(fileBytes);
А затем я загружаю этот код в свою базу данных nosql.Все это работает нормально, но проблема в том, что я не хочу сохранять файл. Вместо этого я хочу напрямую загрузить файл в свою базу данных. И это может быть возможно, если я могу просто преобразовать файл в массив байтов напрямую, не сохраняя его.
public async Task<IActionResult> Index(ICollection<IFormFile> files)
{
foreach (var file in files)
uploaddb(file);
var uploads = Path.Combine(_environment.WebRootPath, "uploads");
foreach (var file in files)
{
if (file.Length > 0)
{
var fileName = ContentDispositionHeaderValue.Parse(file.ContentDisposition).FileName.Trim('"');
///Code to Convert the file into byte array
}
2 ответов:
В отличие от сохранения данных в виде строки (которая выделяет больше памяти, чем требуется, и может не работать, если двоичные данные содержат нулевые байты), я бы рекомендовал подход, более похожий на
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 } } }Также, в интересах других,
IFormFileдокументируется на docs.asp.net с исходным кодом на GitHubEdit
В соответствии с предложениями, я изменил пример, чтобы использовать
CopyToМетод интерфейсаIFormFile
Вы можете использовать следующий код для преобразования его в массив байтов:
foreach (var file in files) { if (file.Length > 0) { var fileName = ContentDispositionHeaderValue.Parse(file.ContentDisposition).FileName.Trim('"'); using (var reader = new StreamReader(file.OpenReadStream())) { string contentAsString = reader.ReadToEnd(); byte[] bytes = new byte[contentAsString.Length * sizeof(char)]; System.Buffer.BlockCopy(contentAsString.ToCharArray(), 0, bytes, 0, bytes.Length); } } }
Comments