2009-06-02 4 views
0

안녕하세요, 현재 웹 요청, 메모리 스트림 및 이미지 객체를 사용하여 웹 서버에 이미지 파일을 보내려고합니다.C# 이미지 요청 객체를 웹 요청으로 보냅니다.

이 요청을 보내는 내 현재의 방법이다 :

public void Send(Image image) 
    { 
     //Assign the request here too, just in case 
     Request = (HttpWebRequest)WebRequest.Create(FormURL); 

     Request.Method = "POST"; 
     Request.ContentType = "multipart/form-data; boundary=" + CONTENT_BOUNDARY; 
     Request.Headers.Add("Cache-Control", "no-cache"); 
     Request.KeepAlive = true; 
     Request.ContentLength = GetFormElements().Length + 
     GetFileHeader(FileName).Length + 
     FILE_TRAIL.Length + 
     ConvertImageToByteArray(image).Length; 

     //Must be done in this order for stream to write properly: 
     //---- 
     //Form elements 
     //File header 
     //Image 
     //File trailer 
     //---- 
     WriteStringToStream(FileStream, GetFormElements()); 
     WriteStringToStream(FileStream, GetFileHeader(FileName)); 
     WriteImageToStream(FileStream, image); 
     WriteStringToStream(FileStream, FILE_TRAIL); 

     string PostData = ASCIIEncoding.ASCII.GetString(ConvertImageToByteArray(image)); 

     StreamWriter SW = new StreamWriter(Request.GetRequestStream(), Encoding.ASCII); 
     SW.Write(PostData); 

     GetRequestResponse(); 
     Console.WriteLine(Request.HaveResponse); 
     FileStream.Close(); 
     Request = null; 

    } 

난 데 문제는 내가 일하는 모습되는 스트림에도 불구하고, 모든 서버에서 모든 응답을받지 못했습니다이다 올바른 길이

필요한 경우, 나는 내 수업의 다른 부분을 게시 할 수 있습니다 (나는 위의 코드에서 일부 디버그 출력을 제거),하지만 지금 여기를 쓰기 기능은 다음과 같습니다

WriteStringToStream :

,
private void WriteStringToStream(System.IO.MemoryStream stream, string String) 
    { 
     byte[] PostData = System.Text.Encoding.ASCII.GetBytes(String); 
     stream.Write(PostData, 0, PostData.Length); 
    } 

WriteImageToSteam :

private void WriteImageToStream(System.IO.MemoryStream Stream, Image img) 
{ 
    Stream.Write(ConvertImageToByteArray(img), 0, ConvertImageToByteArray(img).Length); 
} 

ConvertImageToByteArray :

"하여 FileStream"의 목적은 무엇
private Byte[] ConvertImageToByteArray(Image img) 
    { 
     //Method taken from http://www.csharp-station.com/Articles/Thumbnails.aspx and adapted 
     MemoryStream memStream = new MemoryStream(); 
     img.Save(memStream, System.Drawing.Imaging.ImageFormat.Jpeg); 

     byte[] byteArray = new Byte[memStream.Length]; 

     memStream.Position = 0; 
     memStream.Read(byteArray, 0, (int)memStream.Length); 
     return byteArray; 
    } 
+0

, 당신은) (memStream.ToArray을 반환 프랑수아 수있다; 배열을 선언하고 그 안에 스트림을 읽는 대신에. – SLaks

+0

GetRequestResponse에 어떤 코드가 있습니까? – SLaks

+0

WriteImageToStream에서 ConvertImageToByteArray를 두 번 호출하면 안됩니다. 다소 느려질 것입니다. 대신, 바이트 배열을 선언하고 Length 속성을 읽으십시오. – SLaks

답변

0

문제가 해결 :) 지금 응답이 - 그것은 내가 기대했다하지 어떤 경우에도 ...

ConvertImageToByteArray에서
0

? 선언은 표시되지 않고 데이터를 쓰고 나서 닫습니다. 요청 스트림에 쓰고 잊어 버리셨습니까? Request.ContentLength에서 계산 한 것처럼 보이지만 결코 요청에 쓰지 마십시오.

+0

답장 받기 직전에 요청 스트림에 쓰기 작업을 추가했습니다. 여기에 게시 할 때 우연히 제거했습니다. –

+0

이지만 WriteStringToStream (FileStream, FILE_TRAIL) 행 이후입니다. FileStream은 다시 한 번만 액세스하여 닫습니다. 아마 나는 뭔가를 놓치고있다. –

+0

그게 내 잘못이야, 여기에 코드를 표시하기 위해 일부 디버그 출력을 제거했을 때 실수로 스트림 작성기를 꺼냈다 - 지금 코드에서 바꾼 적이있다. (내 컴퓨터의 코드에 있었다.) –

3

요청을 보내기 전에 SW를 닫아야합니다.

또한 바이트 배열을 ASCII로 변환 한 다음 StreamWriter에 쓰는 대신 바이트 배열을 요청 스트림에 직접 써야합니다. SLaks에 응답

+0

Ok , 바이트 배열을 요청 스트림에 직접 작성했습니다. 그러나 이제 요청 스트림을 닫으려고 할 때 "요청이 중단되었습니다 : 요청이 취소되었습니다."오류가 발생합니다. - Request.GetRequestStream() 사용. 닫기(); - 스트림 작가를 닫으려고하면 오류가 발생합니다. –

0
 private void GetRequestResponse() 
    { 
     if (null == FileStream) 
     { 
      System.IO.Stream stream; 
      WebResponse webResponse; 
      try 
      { 
       webResponse = Request.GetResponse(); 
      } 
      catch (WebException web) 
      { 
       webResponse = web.Response; 
      } 

      if (null != webResponse) 
      { 
       stream = webResponse.GetResponseStream(); 
       StreamReader sr = new StreamReader(stream); 
       string str; 
       Response = ""; 

       while ((str = sr.ReadLine()) != null) 
       { 
        Response += str; 
       } 
       webResponse.Close(); 
      } 
      else 
      { 
       throw new Exception("Error retrieving server response"); 
      } 
     } 
    } 

을 (그리고 요청을 보내기 전에 요청 스트림을 닫고), 상기은 GetRequestResponse의 내용이다. 이 클래스에서 Response는 문자열입니다.

관련 문제