1

ファイルを転送できる単純な Web サーバーを構築しようとしています。
多くの例がありますが、そのほとんどは複雑すぎて、HTTP を使用したことがない人には理解できません

    public Hashtable MimeTypes = new Hashtable();

    public HttpServer(int port)
    {
        this.port = port;

        MimeTypes.Add("html", "text/html");
        MimeTypes.Add("htm", "text/html");
        MimeTypes.Add("css", "text/css");
        MimeTypes.Add("js", "application/x-javascript");

        MimeTypes.Add("png", "image/png");
        MimeTypes.Add("gif", "image/gif");
        MimeTypes.Add("jpg", "image/jpeg");
        MimeTypes.Add("jpeg", "image/jpeg");
    }

    public void writeSuccess(string mime_type, string file_name, int file_size)
    {
        outputStream.Write("HTTP/1.0 200 OK\n");
        outputStream.Write("Content-Type: " + mime_type + "\n");

        if (file_name != null)//if file name isn't null, this mean we need to add additional headers
        {
            outputStream.Write("Content-Disposition: attachment; filename=" + file_name);
            outputStream.Write("Content-Length: " + file_size);
        }

        outputStream.Write("Connection: close\n");
        outputStream.Write("\n");
    }

public override void handleGETRequest(HttpProcessor p)
{
    Console.WriteLine("request: {0}", p.http_url);

    byte[] file_content = null;

    try { file_content = File.ReadAllBytes(work_folder + p.http_url); } //tring to read requested file
    catch (Exception exc) { p.writeFailure(); return; } //return failure if no such file

    string[] splitted_html_url = p.http_url.Split(new char[] { '.' }, StringSplitOptions.RemoveEmptyEntries ); //splitting url for future format check

    string mime_type = "application/octet-stream"; //the most generic type

    if (MimeTypes.Contains(splitted_html_url[splitted_html_url.Length - 1]))
        mime_type = (string)MimeTypes[splitted_html_url[splitted_html_url.Length - 1]]; //set mimy type that math to requested file format

    if (mime_type.Contains("image") || mime_type == "application/octet-stream") //hacky thing for tests...
        p.writeSuccess(mime_type, p.http_url.Remove(0, 1), file_content.Length); //if mime type is image or unknown, than pass file name and length to responce builder
    else
        p.writeSuccess(mime_type, null, 0); //er else just add general headers

    p.outputStream.Write(Encoding.ASCII.GetString(file_content)); //write file content after headers
}

HTML転送では機能しますが、画像を転送することはできません:(
このタグでhtmlページを作成すると:

<img src = "logo225x90.gif" width = "100%" height = "100%" />

このファイルを正しいディレクトリに配置すると、ブラウザに見つからないファイルとして表示されます

4

1 に答える 1

2

あなたは複数の間違いを犯していると思います。

  • サンプル コードのすべての複雑さを回避できると想定しています。
  • 自分のコードを貼り付けて誰かに自分の仕事をさせる代わりに、HTTP について自分自身を教育する必要があります。自分のタスクの範囲からすればそれほど難しいことではありません。
  • コードを実行する IIS で実行できる何かを実行するコードを記述しています (IIS でコードを実行する場合)。
  • ファイルを文字列として書き込んでいますp.outputStream.Write(Encoding.ASCII.GetString(file_content)); //write file content after headers

私は提案します:

于 2012-08-02T15:39:12.163 に答える