2011-10-07 4 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); 

다음은 경계에서 다중/폼 데이터를 분할이 방법을 사용하여 문자열로 변환하고 파일의 경우 여부를 확인하기 위해 각 부분의 첫 번째 줄을 읽습니다. 당신은 전체 코드 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

첫 번째 행은 제 라인이 세 번째 라인은 물론 첫 번째 행

Encoding.ASCII.GetBytes(rawdata);를 사용 Encoding.UTF8.GetBytes(rawdata);

를 사용 context.Request.Files[name].InputStream.Read(data, 0, fs);

로부터의 화상을 얻는 내지 맞고 작동합니다. 지금 임 그냥 결과를 얻을 첫 번째 줄을 사용하여 사람이 어떻게 입력 스트림에서 읽을을 가르쳐 수 없다면 아마 그 상태를 유지합니다 들어

SQL Result

.


UPDATE

이 대상이되는 문제는 라인 49에있는 코드 Source Code를 공유 할 수있는 좋은 장소를 발견 지금은 단지 문자열로 콘텐츠를하지 마십시오 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에서 전에 시도하지 않은 파일 저장 옵션이 있음). 다음은 SQL 서버에 저장하는 byte[]으로 데이터를 읽을 줄 방법은 다음과 같습니다

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

지금까지 오페라가 간다, 나는 당신이 가져온 문제에 익숙하지 않다 . 어쩌면 당신은 "오페라가 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

@ 조나단, OP는 SQL 서버에 물건을 저장하기 위해 직접 ADO.NET을 사용하고 있다고 지정하지 않았습니다. ORM이 사용 중이면 바이트 배열이 필요할 수 있습니다. – Jacob

+0

Opera는 FormData()를 아직 지원하지 않으므로 base64로 변환하는 FileReader.GetDataAsURL()을 사용해야합니다. – Christian

관련 문제