2011-10-07 48 views
0

試圖使用文件輸入上載表單,只從輸入流獲取表單字段而不是File.Request方法。如何將其轉換爲要存儲在SQL中的圖像

表單包含一個文件輸入和幾個文本框,所以我不能上傳流到數據庫。

我轉換爲字符串使用這種方法

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

,然後在邊界處拆分的multipart/form-data的和讀取的每個部分的第一行,以查看是否它的一個文件或沒有。你可以看到完整的代碼Here

的文件將是這個樣子

-----------------------------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;[email protected]@'0GLF?K:[email protected]> >)#)>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>��!������ }!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

找到了一個不錯的地方共享代碼Source Code麻煩的是上線49現在只是讀取Request.Files

+3

這確實是一個圖像,所以__do不會將其轉換爲任何形式的文本。 –

+0

如果我把它作爲字符串,我會得到「無法將參數值從字符串轉換爲字節[]。」 – Christian

回答

3

你應該圖像不存儲爲文本,存放在其原始二進制形式,如果你有存儲二進制數據,文本,你需要使用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; 

你也需要做反向得到它回到了一個可用的圖像格式er解決方案是將二進制映像存儲在數據庫中的blob/binary字段類型中。

EDITED:剛剛重讀你的文章,我看到你的數據已經在base64,只是存儲比數據庫?

再次編輯:初始問題已編輯多次,我相信我回答了這個問題,但現在問題已經通過多次迭代改變,現在我的初始答案不太適用。

1

不要把內容作爲字符串。理想情況下,您應該有一個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必須使用FileReader以base64上傳。「如果你仍然要處理Base64編碼字符串,這裏是你如何將其轉換爲一個byte[]

using (var reader = new StreamReader(context.Request.InputStream)) 
{ 
    var base64Str = reader.ReadToEnd(); 
    var bytes = Convert.FromBase64String(base64Str); 
} 
+0

-1你可以直接發送流到SQL服務器... –

+2

@Jonathan,OP沒有指定他們直接使用ADO.NET存儲在SQL Server中的東西。如果ORM正在使用,那麼他們可能需要一個字節數組。 – Jacob

+0

Opera不支持FormData(),所以您必須使用FileReader.GetDataAsURL()將其轉換爲base64。 – Christian

相關問題