2017-12-11 18 views
0

C#でHTTPを使用してPNGを送信する、と私は、通常のHTMLファイルや場所にサブフォルダをなどを持っていると正常に動作...しかし、私の問題の嘘PNGファイルを送信します。私はC#で私自身の簡単なウェブサーバを開発してい

ブラウザでHTTPリクエストが行われ、他のコードが魔法のようになったら、レスポンスヘッダーを送信する必要があります。これを行うコードは次のとおりです。

012この例では、swはブラウザへのソケット接続用のStreamWriterです。

これを実行すると、画像を読み込むときに通常と同じようにブラウザの画面が黒くなりますが、画像が読み込まれず回転ローディングホイールが無限に回転します。

これを動作させるにはどうすればよいですか?ありがとう。

+0

あなたは[ディレクトリトラバーサル]から身を守るために必要があります( https://www.owasp.org/index.php/Path_Traversal)。 URLは '../../ something'であり、あなたのアプリは単にその中に入れます。 – spender

+0

@spenderそこにありました;)これは、上記のコードよりも前のメインリクエストハンドラコードの間に他の場所で既に実装されています。 – DevelopedLogic

+1

[StreamWriter.Write'](https://msdn.microsoft.com/en-us/library/system.io.streamwriter.write(v = vs.110).aspx)のオーバーロードにより、使っている? ;)私は 'byte []'のためのものを見ないので、おそらくオブジェクトを取るものです。 StreamWriterをフラッシュし、バイトを直接基になるストリームに書き込むほうが良いかもしれません。 – spender

答えて

-1

StreamWriter(ストリームに特定のEncodingの文字列を書き込むように設計されている)をバイナリデータで使用すると、面倒なことが起こります。

StreamWriter.Writeというオーバーロードを呼び出すように見えるのは、バイトを出力ストリームにそのまま書き込むという信念です。ドキュメントは、実際にはこの過...

は、次の2つのオプションがあり、そのオブジェクト

にToStringメソッドを呼び出すことにより、テキスト文字列またはストリームにオブジェクトのテキスト表現を書き込みますと述べています。

byte[] ImgFile = File.ReadAllBytes(Program.Start_Directory + URL); 
sw.Write("HTTP/1.0 200 OK\r\n"); 
//...etc 
sw.Flush(); 
sw.BaseStream.Write(ImgFile,0,ImgFile.Length); 

か、単にバイトに全力を尽くす:基本となるストリームに直接バイナリデータを書き込む、その後、StreamWriterFlushを使用してキャリー

var sb=new StringBuilder(); 
sb.AppendLine("HTTP/1.0 200 OK"); 
//...etc 
var headerBytes = Encoding.ASCII.GetBytes(sb.ToString()); 
Stream str = iGotTheStreamFromSomewhere; 
str.Write(headerBytes,0,headerBytes.Length); 
str.Write(ImgFile,0,ImgFile.Length); 
+0

コードの最初の部分は完全に機能します!ありがとう! – DevelopedLogic

+0

downvote andと受け入れます。うーん。 – spender

+0

私はdownvoteしませんでした。私はupvotedしかし15未満の評判はまだ数えない、そして他の誰かがdownvoted。 – DevelopedLogic

関連する問題