Каков правильный способ передачи файла с помощью HTTP-ответа?

Я пытаюсь создать простой веб-сервер, способный передавать файлы.
Я знаю, примеров много, но большинство из них слишком сложны для понимания тем, кто никогда не работал с 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%" />

и поместите этот файл в правильный каталог, он все еще отображается в браузере как отсутствующий файл


person Kosmo零    schedule 02.08.2012    source источник
comment
отладьте и проверьте правильность work_folder + p.http_url, возможно, в пути отсутствует символ \ или /?   -  person user1519979    schedule 02.08.2012
comment
ничего не пропало. файл успешно прочитан   -  person Kosmo零    schedule 02.08.2012


Ответы (1)


Я думаю, что вы делаете несколько ошибок.

  • Вы предполагаете, что сможете избежать всей сложности кода примера.
  • Вместо того, чтобы вставлять свой код и заставлять кого-то делать вашу работу, вы должны изучить HTTP - это не должно быть слишком сложно для объема вашей задачи.
  • Вы пишете код, чтобы сделать что-то, что может сделать IIS, который запускает ваш код (если вы запускаете свой код в IIS)
  • Вы пишете файл как строку с p.outputStream.Write(Encoding.ASCII.GetString(file_content)); //write file content after headers

Я предлагаю:

person tymtam    schedule 02.08.2012
comment
1. Мне удалось избежать всей сложности и изменить исходный код, который мог отправлять только статические сгенерированные кодовые страницы, в код, который мог отправлять чтение с файлов жесткого диска 2. Я никогда не просил кого-то делать мою работу, я просто спросил, что неправильный? 3. Мне нужен встроенный http-сервер в моем основном приложении, который не имеет никаких соединений с IIS, и я не хочу, чтобы пользователи устанавливали IIS для запуска моего приложения. 4. Спасибо, это все, что я хотел знать - person Kosmo零; 02.08.2012
comment
Я предлагаю Tymek не хамить, отвечая на вопросы. - person Hashim Akhtar; 04.07.2015