#c# #asp.net #inputstream
#c# #asp.net #входной поток
Вопрос:
Попытка загрузить форму с файловым вводом, получая только поля формы из входного потока, а не из файла.Метод запроса.
Форма содержит ввод файла и пару текстовых полей, поэтому я не могу просто загрузить поток в базу данных.
Я конвертирую в строку, используя этот метод
int len = Convert.ToInt32(context.Request.InputStream.Length);
byte[] stream = new byte[len];
context.Request.InputStream.Read(stream, 0, len);
string mime = Encoding.UTF8.GetString(stream);
а затем разделить составные / form-данные по границам и прочитать первую строку каждой части, чтобы узнать, является ли это файлом или нет. Вы можете увидеть полный код здесь
Файл будет выглядеть примерно так
-----------------------------17901701330412
Content-Disposition: form-data; name="file"; filename="IMG00004-20101209-1704.jpg"
Content-Type: image/jpeg
�����ExifII* ����(1�2�i��Research In MotionBlackBerry 9105HHRim Exif Version1.00a2010:12:09 17:03:59 ��n�0220�v���� � ��� �2010:12:09 17:03:59��� $ amp;amp;$ #"(-:1( 6 "#2D36;=@A@'0GLF?K:?@> >)#)>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>��!������ }!1AQa"q2���#B��R��$3br� %amp;'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz������������������������������������������������������������������������� w!1AQaq"2�B���� #3R�br� $4�%�amp;'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz�������������������������������������������������������������������������� ?�`��ⳓ5��f)¤b��a�BS�Sb�)Xz�֝�q�"s�K�PA���}F7amp;��Vm��GӬ��%]� Uҵ�Z7��h�`�@amp;i ��i��MKB�P��r���-�B|ϛ=3Yٶ ��
и поле будет выглядеть примерно так
-----------------------------17901701330412
Content-Disposition: form-data; name="parent"
clientphotos
Разбор поля прост, и получить содержимое изображения легко, но затем сохранить его в базе данных, чтобы я мог прочитать его обратно как изображение, не так просто.
Я пробовал byte[] data = Encoding.UTF8.GetBytes(rawdata);
, но результат неверен.
Есть ли у кого-нибудь идеи, как взять содержимое изображения и сохранить его в a byte[]
, как это должно быть?
Обновить
Первая строка — это получение изображения из context.Request.Files[name].InputStream.Read(data, 0, fs);
Вторая строка использует Encoding.UTF8.GetBytes(rawdata);
Третья строка использует Encoding.ASCII.GetBytes(rawdata);
Очевидно, что первая строка правильная и работает.
На данный момент я просто использую первую строку для получения результата, и, вероятно, так и останется, если кто-нибудь не научит меня, как читать его из входного потока.
Обновить
Нашел хорошее место для обмена исходным кодом кода Проблема в строке 49, которая на данный момент просто читает Request.Files
Комментарии:
1. Это действительно изображение, поэтому не преобразуйте его в какую-либо форму текста.
2. Если я оставлю его в виде строки, я получу «Не удалось преобразовать значение параметра из строки в байт []».
Ответ №1:
Вы не должны сохранять изображение в виде текста, хранить в его необработанной двоичной форме. Если вам НУЖНО хранить двоичные данные в виде текста, вам нужно будет закодировать его с помощью Base64, но он будет намного больше, чем нужно.
http://www.vbforums.com/showthread.php?t=287324
byte[] encData_byte = new byte[data.Length];
encData_byte = System.Text.Encoding.UTF8.GetBytes(data);
string encodedData = Convert.ToBase64String(encData_byte);
return encodedData;
Вам также нужно будет сделать обратное, чтобы вернуть его в удобный формат изображения. Гораздо лучшим решением было бы сохранить двоичное изображение в виде большого двоичного объекта / двоичного типа поля в базе данных.
ОТРЕДАКТИРОВАНО: просто перечитайте ваш пост, и я вижу, что ваши данные уже находятся в base64, просто храните их в базе данных?
ОТРЕДАКТИРОВАНО ЕЩЕ РАЗ: первоначальный вопрос редактировался несколько раз, я полагаю, что я ответил на вопрос, но теперь вопрос изменился через несколько итераций, и мой первоначальный ответ теперь менее применим.
Ответ №2:
Не получайте содержимое в виде строки. В идеале у вас должен быть varbinary(max)
столбец для хранения этих данных (есть также вариант хранения файлов, который я раньше не пробовал в SQL Server 2008). Вот как вы будете считывать данные в a byte[]
для сохранения в SQL Server:
var file = Request.Files[0];
var buffer = new byte[file.ContentLength];
using (var stream = file.InputStream)
{
var bytesRead = 0;
while (bytesRead < file.ContentLength)
{
bytesRead = stream.Read(
buffer, bytesRead, file.ContentLength - bytesRead);
}
}
Что касается Opera, я не знаком с проблемой, которую вы затронули. Может быть, вы могли бы опубликовать ссылку, объясняющую, что вы подразумеваете под «Opera должна загружать в base64 с помощью FileReader
» . Если вам все еще нужно обработать строку Base64, вот как вы можете преобразовать ее в byte[]
:
using (var reader = new StreamReader(context.Request.InputStream))
{
var base64Str = reader.ReadToEnd();
var bytes = Convert.FromBase64String(base64Str);
}
Комментарии:
1. @Jonathan, в OP не указано, что они напрямую используют ADO.NET для хранения вещей в SQL Server. Если используется ORM, им может потребоваться массив байтов.
2. Opera пока не поддерживает FormData(), поэтому вам придется использовать FileReader. GetDataAsURL(), который преобразует его в base64.
3. Я не знаю, что вы подразумеваете под «Opera пока не поддерживает FormData()». Я был бы очень удивлен, если бы Opera не позволяла загружать файлы, как любой другой веб-браузер. Может быть, вам следует опубликовать, как выглядит ваш HTML / JS, который выполняет загрузку файла.