Как преобразовать это в изображение для хранения в SQL - PullRequest
0 голосов
/ 07 октября 2011

Попытка загрузить форму с помощью файла ввода, получая только поля формы из потока ввода, а не метод File.Request.

Форма содержит файл ввода и пару текстовых полей, поэтому я не могу просто загрузить поток в базу данных.

Я конвертирую в строку, используя этот метод

    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);

, а затем разделите составные данные / данные формы на границах и прочитайте первую строку каждой части, чтобы увидеть, является ли это файлом или нет. Вы можете увидеть полный код Здесь

Файл будет выглядеть примерно так

-----------------------------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���    $ &&$ #"(-:1(+6+"#2D36;=@A@'0GLF?K:?@>  >)#)>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>��!������ }!1AQa"q2���#B��R��$3br� %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz������������������������������������������������������������������������� w!1AQaq"2�B���� #3R�br� $4�%�&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz�������������������������������������������������������������������������� ?�`��ⳓ5��f)¤b��a�BS�Sb�)Xz�֝�q�"s�K�PA���}F7&��Vm��GӬ��%]� Uҵ�Z7��h�`�@&i ��i��MKB�P��r���-�B|ϛ=3Yٶ ��

и поле будет выглядеть примерно так

-----------------------------17901701330412 
Content-Disposition: form-data; name="parent" 

clientphotos

Синтаксический анализ поля прост, получение содержимого изображения легко, но затем сохранить его в базе данных, чтобы я мог прочитать его обратно как изображение, не так просто.

Я пытался byte[] data = Encoding.UTF8.GetBytes(rawdata);, но вывод неправильный.

У кого-нибудь есть идеи, как взять содержимое изображения и сохранить его в byte[] в порядке?


UPDATE

Первая строка - получение изображения из context.Request.Files[name].InputStream.Read(data, 0, fs);

Вторая строка использует Encoding.UTF8.GetBytes(rawdata);

Третья строка использует Encoding.ASCII.GetBytes(rawdata);

Очевидно, что первая строка верна и работает.

SQL Result

Пока я просто использую первую строку, чтобы получить результат, и он, вероятно, останется таким, если кто-то не научит меня читать его из входного потока.


UPDATE

Нашел хорошее место, чтобы поделиться кодом Исходный код Проблема в строке 49, которая пока просто читает Request.Files

Ответы [ 2 ]

3 голосов
/ 07 октября 2011

Не следует хранить изображение в виде текста, хранить в необработанном двоичном виде. Если вы ДОЛЖНЫ хранить двоичные данные в виде текста, вам необходимо кодировать их с помощью 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, просто сохранить, чем в базе данных?

ВНОВЬ ИЗМЕНЕНО: Первоначальный вопрос несколько раз редактировался, я думаю, что я ответил на вопрос, но теперь вопрос изменился через ряд итераций, и мой первоначальный ответ теперь менее применим.

1 голос
/ 07 октября 2011

Не получать содержимое в виде строки .В идеале у вас должен быть столбец varbinary(max) для хранения этих данных (есть также опция хранения файлов, которую я раньше не пробовал в SQL Server 2008).Вот как вы читаете данные в 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);
}
...