Как создать байтовый массив из 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?
Шиви

Разве это не строка file.InputStream.Read (buffer, 0, file.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
Как упомянуто ниже Джеффом, b.ReadBytes (file.InputStream.Length); должен быть byte [] binData = b.ReadBytes (file.ContentLength); поскольку .Length - это long, тогда как ReadBytes ожидает int.
Спанчбой

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

Работай как шарм. Спасибо за это простое решение (с комментариями Джеффа, Губки и Криса)!
Дэвид

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

в вашем вопросе и буфер, и byteArray кажутся байтами []. Так:

ImageElement image = ImageElement.FromBinary(buffer);

2

перед stream.copyto необходимо сбросить stream.position в 0; тогда работает нормально.


2

Для изображений, если вы используете Web Pages 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.