Як створити байтовий масив з HttpPostedFile


155

Я використовую компонент зображення, який має метод FromBinary. Цікаво, як перетворити вхідний потік в байтовий масив

HttpPostedFile file = context.Request.Files[0];
byte[] buffer = new byte[file.ContentLength];
file.InputStream.Read(buffer, 0, file.ContentLength);

ImageElement image = ImageElement.FromBinary(byteArray);

як ми розміщуємо файл на іншій сторінці .aspx?
— шиві

Не має цього файлу рядків.InputStream.Read (буфер, 0, файл.ContentLength); заповнити буфер байтами з вхідного потоку? Чому ми повинні використовувати BinaryReader.ReadBytes (...), як згадує @Wolfwyrd у відповіді нижче? Не буде ImageElement.FromBinary (буфер); виправити проблему?
— Шрінідхі Шанкар

Відповіді:


290

Використовуйте об'єкт BinaryReader, щоб повернути байтовий масив із потоку, наприклад:

byte[] fileData = null;
using (var binaryReader = new BinaryReader(Request.Files[0].InputStream))
{
    fileData = binaryReader.ReadBytes(Request.Files[0].ContentLength);
}

1
Як згадував нижче jeff, b.ReadBytes (file.InputStream.Length); повинен бути байт [] binData = b.ReadBytes (file.ContentLength); як .Length довгий, тоді як ReadBytes очікує int.
— Губкабой

Не забудьте закрити BinaryReader.
— Кріс Дуайер

Працюй як шарм. Дякую за це просте рішення (з коментарями jeff, Spongeboy та Chris)!
— Девід

29
Бінарний зчитувач не повинен бути закритим, оскільки є використання, яке автоматично закриває зчитувач у розпорядженні
— BeardinaSuit

1
Будь-яка ідея, чому це не працюватиме для файлу .docx? stackoverflow.com/questions/19232932 / ...
— wilsjd

25
BinaryReader b = new BinaryReader(file.InputStream);
byte[] binData = b.ReadBytes(file.InputStream.Length);

рядок 2 слід замінити на

byte[] binData = b.ReadBytes(file.ContentLength);

12

Він не працюватиме, якщо ваш файл InputStream.Position встановлений в кінці потоку. Мої додаткові рядки:

Stream stream = file.InputStream;
stream.Position = 0;

3

у вашому питанні і буфер, і байтArray здаються байтами]. Так:

ImageElement image = ImageElement.FromBinary(buffer);

2

перед stream.copyto, ви повинні скинути stream.position до 0; тоді це добре працює.


2

Для зображень, якщо ваші веб-сторінки v2 використовують клас WebImage

var webImage = new System.Web.Helpers.WebImage(Request.Files[0].InputStream);
byte[] imgByteArray = webImage.GetBytes();
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.