2016-09-27 3 views
1

다음 코드를 사용하여 FTP 서버에 이미지를 업로드하고 있는데 문제가 있습니다. 업로드하기 전에 이미지의 크기 (높이와 너비)를 확인하기 위해 코드를 사용하면 .png 파일이 FTP 서버에 생성되었지만 비어 있거나 잘못된 형식이며 치수를 확인하기 위해 코드를 제거하면 이미지가 올바르게 업로드됩니다. 이것에 대해 어떤 생각이 있습니까? 언급 한 바와 같이 당신이 당신의 Image에로드 할 때FTP로 이미지 업로드 문제

public ActionResult UploadFile(int type, HttpPostedFileBase imagefile) 
    { 
     //check image height and width 
     using (System.Drawing.Image image = System.Drawing.Image.FromStream(imagefile.InputStream, true, true)) 
     { 
      if (image.Width > 160 || image.Height > 160) 
      { 
       //do something here 
      } 
     }//end check image height and width 

     FtpWebRequest request = (FtpWebRequest)WebRequest.Create("ftpPath" + "/" + imagefile.FileName); 
     request.Credentials = new NetworkCredential("ftpUserName", "ftpPassword"); 

     request.Method = WebRequestMethods.Ftp.UploadFile; 
     var sourceStream = imagefile.InputStream; 
     Stream requestStream = request.GetRequestStream(); 
     request.ContentLength = sourceStream.Length; 
     int BUFFER_SIZE = imagefile.ContentLength; 
     byte[] buffer = new byte[BUFFER_SIZE]; 
     int bytesRead = sourceStream.Read(buffer, 0, BUFFER_SIZE); 
     do 
     { 
      requestStream.Write(buffer, 0, bytesRead); 
      bytesRead = sourceStream.Read(buffer, 0, BUFFER_SIZE); 
     } while (bytesRead > 0); 
     sourceStream.Close(); 
     requestStream.Close(); 
     FtpWebResponse response = (FtpWebResponse)request.GetResponse(); 
     response.Close(); 
} 
+1

'FromStream'을 호출하면'InputStream'을 사용하여 스트림의 끝 부분에있게됩니다. 따라서 나중에 읽을 때 읽을 부분이 없습니다. 스트림을 처음으로 재설정하거나 모든 것을 바이트 배열로 읽어 와서 별도의 스트림을 만들어야합니다. –

+0

"올바르게 업로드"대신 "잘못 업로드되었습니다"라고 쓰고 싶습니까? – JohnH

답변

0

고마워들이 매우 도움이되었다하지만 아래 내 코드에 약간 변경하여이 문제를 해결, I는 입력 스트림을 읽은 후 이미지 치수를 확인했습니다. 누군가 도움이 될 수 있습니다.

public string ftpUpload(HttpPostedFileBase imagefile, string filename) 
     { 
      var sourceStream = imagefile.InputStream; 
      int BUFFER_SIZE = imagefile.ContentLength; 
      byte[] buffer = new byte[BUFFER_SIZE]; 
      int bytesRead = sourceStream.Read(buffer, 0, BUFFER_SIZE); 

      if (!CheckLogoDimension(sourceStream)) 
      { 
       sourceStream.Close(); 
       return "error"; 
      } 

      FtpWebRequest request = (FtpWebRequest)WebRequest.Create(ftpRootPath + "/" + filename); 
      request.Credentials = new NetworkCredential(ftpUserName, ftpPassword); 

      request.Method = WebRequestMethods.Ftp.UploadFile; 

      Stream requestStream = request.GetRequestStream(); 
      request.ContentLength = sourceStream.Length; 
      do 
      { 
       requestStream.Write(buffer, 0, bytesRead); 
       bytesRead = sourceStream.Read(buffer, 0, BUFFER_SIZE); 
      } while (bytesRead > 0); 
      sourceStream.Close(); 
      requestStream.Close(); 
      FtpWebResponse response = (FtpWebResponse)request.GetResponse(); 
      response.Close(); 

      return "Success"; 
     } 
0

, 당신은 모든 스트림을 읽고있다. 그러나 NetworkStream (InputStream)에서 위치 (예 : '검색')를 재설정 할 수 있다고 생각하지 않습니다. 일단 당신이 그것을 읽으면, 그것은 없어집니다.

그래도 할 수있는 한 가지는 MemoryStream을 만들고 Stream.CopyTo을 사용하여 내용을 복사하는 것입니다. 그런 다음 위치를 0으로 재설정하여 "다시 읽으십시오"를 포함하여 원하는 모든 것을 할 수 있습니다. 답장을

//example of resetting a stream named "s" 
s.Position = 0;