Как преобразовать это в изображение для хранения в SQL

#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* ����(12�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);

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

Результат SQL

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


Обновить

Нашел хорошее место для обмена исходным кодом кода Проблема в строке 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, который выполняет загрузку файла.