Як створити байтовий масив з 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.