Как создать байтовый массив из 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);
}
Wolfwyrd
источник
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);
devio
источник
2

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

xpfans
источник
2

Для изображений, если вы используете Web Pages v2, используйте класс WebImage

var webImage = new System.Web.Helpers.WebImage(Request.Files[0].InputStream);
byte[] imgByteArray = webImage.GetBytes();
Jodda
источник