2013-07-01 1 views
0

내가 왜 내가하려는 일을해야하는지 설명하려고하면 오랜 시간이 걸릴 것이지만 기본적으로 다음과 같습니다. 사용자가 선택할 수있는 FileUpload 컨트롤이 있습니다. Jpeg 파일을 업로드하면 그 파일을 바이트로 변환하고 Image 컨트롤의 소스로 사용하려고합니다. BinaryReader.ReadBytes가 문자열로 변환 될 때

내 코드

이 하나입니다 바이트 배열 확인을 찾고,하지만 난 문자열로 변환 할 때 내가 내가 대신 같은 일을 다른 페이지가, 인식 할 수없는 문자가 가득

string fileName = Server.MapPath("~/TempImages") + @"\foto.jpg"; 
fileUpload1.SaveAs(fileName); 

System.IO.FileStream fs = new System.IO.FileStream(fileName, System.IO.FileMode.Open, System.IO.FileAccess.Read); 
System.IO.BinaryReader binaryReader = new System.IO.BinaryReader(fs); 
long byteLength = new System.IO.FileInfo(fileName).Length; 
byte[] buffer = binaryReader.ReadBytes((Int32)byteLength); 
fs.Close(); 
fs.Dispose(); 

string valor = System.Text.Encoding.UTF8.GetString(buffer); 
img.ImageUrl = "data:image/jpg;base64," + valor; 

파일에서 바이트를 얻는 것은 MySql 데이터베이스에서 가져오고 같은 System.Text.Encoding.UTF8.GetString을 사용하면 문제가 해결됩니다.

DataView dv = (DataView)SqlDataSource3.Select(DataSourceSelectArguments.Empty); 
byte[] buffer = (byte[])dv.Table.Rows[0]["BIN_FOTO"]; 
string valor = System.Text.Encoding.UTF8.GetString(buffer); 
img.ImageUrl = "data:image/jpg;base64," + valor; 

이 SqlDataSource3의 선택은 간단한 Select BIN_FOTO from temp_image입니다 :

UPDATE 요청으로 , 이것은 MySQL 데이터베이스에서 검색 할 때 내가 사용하는 코드입니다.

private string ImageToBase64String(System.Drawing.Image imageData, ImageFormat format) 
    { 
     string base64; 
     MemoryStream memory = new MemoryStream(); 
     imageData.Save(memory, format); 
     base64 = System.Convert.ToBase64String(memory.ToArray()); 
     memory.Close(); 
     memory.Dispose(); 

     return base64; 
    } 

그런 다음 나는 데이터베이스에 base64 변수를 저장 : 나는 코드가 내가 캡처 웹캠이 이미지를 변환하는 데 사용할, 웹캠 캡처 WPF 프로그램에서 데이터베이스에이 값을 저장합니다.

희망이 내 문제

+0

문자열에 이미지 바이트 배열을 해석하지 않을

그런데

,이 코드의 BinaryReader에 대한 필요가 없습니다 너에게 무엇이든지 알게 해줘. 이미지가 MySql에 어떻게 저장되는지 보는 것은 흥미로울 것입니다. 저장 또는 검색 중 일부 변환이있을 가능성이 있습니다. –

+0

MySql에 저장하는 방법을 보여주기 위해 업데이트했습니다. –

답변

2

그래서 이미지 파일을 읽고 독서 코드 후베이스 (64)로 변환 할 다음을 수행

string valor = Convert.ToBase64String(buffer); 

원래 코드 결함이었다 당신이 바이트로, 이미지를 저장하고 있기 때문에,에 코드 행으로 파일 : 64 기수로 저장, 그래서 당신은 당신이 그것을 읽은 후 (64)를 기초로 변환 할 필요가 없습니다 것

fileUpload1.SaveAs(fileName); 

. 저장되기 전에 데이터가 base64로 변환 되었기 때문에 MySql 읽기가 효과가있었습니다.

System.IO.FileStream fs = new System.IO.FileStream(fileName, System.IO.FileMode.Open, System.IO.FileAccess.Read); 
System.IO.BinaryReader binaryReader = new System.IO.BinaryReader(fs); 
long byteLength = new System.IO.FileInfo(fileName).Length; 
byte[] buffer = binaryReader.ReadBytes((Int32)byteLength); 
fs.Close(); 
fs.Dispose(); 

당신은 대신 쓸 수 있습니다 :

byte[] buffer; 
using (FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read) 
{ 
    long byteLength = fs.Length; 
    buffer = new byte[byteLength]; 
    int bytesRead = fs.Read(buffer, 0, byteLength); 
    // optional error check to see that you got all the bytes 
    if (bytesRead != byteLength) 
    { 
     // handle error 
    } 
} 
string valor = Convert.ToBase64String(buffer); 
+0

그래, 어쨌든, 귀하의 답변을하기 전에 초 밖으로 발견하지만, 내 첫 번째 방법으로 문제가 뭐야? 데이터베이스에서 바이트를 가져 왔을 때 작동했지만 파일에서 나온 바이트는 작동을 멈췄습니다. –

+0

설명 주셔서 감사합니다! –

0

명확히 나는 내가 Base64String로 이미지를 변환하는 데 사용되는 WPF 코드를 찾고, 문제를 발견했습니다. 난 그냥 같은 기능 ImageToBase64String을 만들어 지금은 작동합니다

 string fileName = Server.MapPath("~/TempImages") + @"\foto.jpg"; 
     fileUpload1.SaveAs(fileName); 

     System.Drawing.Image teste = System.Drawing.Image.FromFile(fileName); 

     string valor = ImageToBase64String(teste, System.Drawing.Imaging.ImageFormat.Jpeg); 

     //System.IO.FileStream fs = new System.IO.FileStream(fileName, System.IO.FileMode.Open, System.IO.FileAccess.Read); 
     //System.IO.BinaryReader binaryReader = new System.IO.BinaryReader(fs); 
     //long byteLength = new System.IO.FileInfo(fileName).Length; 
     //byte[] buffer = binaryReader.ReadBytes((Int32)byteLength); 
     //buffer = File.ReadAllBytes(fileName); 
     //fs.Close(); 
     //fs.Dispose(); 

     //string valor = System.Text.Encoding.UTF8.GetString(buffer); 
     img.ImageUrl = "data:image/jpg;base64," + valor; 

하지만 난 여전히 내 앞의 코드로 잘못 알고하지 않는 사람이 명확하게 할 수 있습니까?