2016-09-27 24 views
1

次のコードを使用してFTPサーバーに画像をアップロードしていますが、問題があります。アップロードする前に画像の寸法(高さと幅)を確認するコードを使用すると、FTPサーバーに.pngファイルが作成されていますが、空(または無効な形式)です。寸法を確認するコードを削除すると、画像が正しくアップロードされます。これについて何か考えている人はいますか?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

みんなありがとう。誰かがこれが役に立つと思うかもしれません。

​​
0

前述のとおり、すべてのストリームをImageに読み込むと、ストリームが読み込まれます。ただし、NetworkStream(InputStream)の位置(「シーク」)をリセットすることはできません。一度それを読んだら、それはなくなってしまった。

あなたができることは、MemoryStreamを作成し、Stream.CopyToを使用してコンテンツをコピーすることです。それから、あなたはそれを使って好きなことをすることができます。ポジションを0に戻して「もう一度読む」ことができます。彼らは非常に有用だったが、私は、私は、入力ストリームを読んだ後の画像の寸法を確認し、以下のように自分のコードに若干の変更を加えることによって、この問題を修正し、返信用

//example of resetting a stream named "s" 
s.Position = 0; 
関連する問題