Как создать объект файла из абсолютного пути?

Я думаю, что моя проблема займет некоторое объяснение фона. Моя задача - создать базовый сервер, который будет отправлять HTML-файлы в моей системе по запросу клиентов. Мне сказали проверить мой сервер, просто введя localhost:8080/index.html в моем браузере Firefox в качестве тестового клиента. Ввод в этой строке ввода работает правильно и распечатывает содержимое index.html, В целях безопасности я должен проверить, чтобы убедиться, что запрошенный файл находится в пределах моей текущей работы напрямую, и если это не так, я должен отклонить запрос. Я настроил именно такой улов и хочу его проверить. Я хочу использовать мой файл index.html опять же, но по всему пути C:\Users\Gabrielle\Documents\NetBeansProjects\CS2 Assignment 5\src\index.html Поэтому я вхожу в свой браузер

localhost:8080/C:\Users\Gabrielle\Documents\NetBeansProjects\CS2 Assignment 5\src\index.html

и мне дают ошибку, которая говорит, что файл не существует. Затем я проверил, чтобы увидеть, из чего он пытается сделать файл, и он пытается сделать файл из, и я получаю

C:%5CUsers%5C%5CGabreille%5C%5CDocuments%5C%5CNetBeansProjects%5C%5CCS2%20Assignment%205%5Cindex.html

который явно не является именем файла. Я просто отправляю в имени файла неправильно? Если это имеет какое-то значение, я запускаю программу из командной строки Windows. Ниже приведен код моего многопоточного клиента и код моего запускаемого объекта. Если у вас есть какие-либо вопросы или вы хотите прояснить ситуацию, я буду внимательно следить за этой веткой.

import java.io.*;
import java.net.*;

public class WebServer {

    public static void main(String[] args)
    {
        try{
            ServerSocket ss = new ServerSocket(8080);
            while(true){
                Thread conn = new Thread(new ClientConnection(ss.accept()));
                conn.start();
            }
        }
        catch(IOException e)
        {
            e.printStackTrace();
        }
    }
}

Вот актуальный контент

import java.io.*;
import java.net.*;

public class ClientConnection  implements Runnable{

private Socket socket;
File requestedFileName;
String entireInput ="";
String editedInput="";
String fileContent="";
String fileLine="";
PrintWriter out;
File defaultFile = new File("index.html");
File toBeRead;

public ClientConnection(Socket socket)
{
    this.socket=socket;
}

public void run()
{
    try{
        System.out.println("Client Connected");
        String workingDirectory = System.getProperty("user.dir");
        BufferedReader in =
                new BufferedReader(new InputStreamReader(socket.getInputStream()));
         out = new PrintWriter(socket.getOutputStream());
        String line;
            entireInput = in.readLine();

        editedInput= entireInput.substring(entireInput.indexOf("GET")+3,
                entireInput.indexOf("HTTP/1.1"));
        System.out.println("File name:" + editedInput);
        requestedFileName = new File(editedInput);
        System.out.println("What about here?");
        if(editedInput.equals(" / ") || editedInput.equals("  "))
        {
            toBeRead = defaultFile;
            System.out.println("Parent file "+toBeRead.getParent());
            String absolutePath = toBeRead.getAbsolutePath();
            System.out.println("absolute path "+ absolutePath);
            String filePath = absolutePath.substring(0,absolutePath.lastIndexOf(File.separator));
            if(filePath.equals(workingDirectory))
            {
                System.out.println("is in directory");
            }
            else{
                System.out.println("not in directory");
            }
        }
        else
        {   

            String hope = editedInput.substring(2);
            toBeRead = new File(hope);
        }

             //toBeRead = new File("index.html");
            if(toBeRead.exists())
            {
                System.out.println("File exists");
            }
            else
            {
                System.out.println("file doesn't exist");
            }
           BufferedReader fileIn = new BufferedReader(new FileReader(toBeRead));

           while((fileLine = fileIn.readLine()) != null)
             {
               //System.out.println("can i get in while loop?");
               fileContent = fileContent + fileLine;
                //System.out.println("File content: \n" + fileContent);
             }

           out.print("HTTP/1.1 200 OK\r\n");
           out.print("content-type: text/html\r\n\r\n");
           out.print(fileContent);
           out.flush();
           out.close();

        }
        catch(FileNotFoundException f)
        {
            System.out.println("File not found");
            out.print("HTTP/1.1 404 Not Found\r\n\r\n");
            out.flush();
            out.close();
        }
        catch(Exception e)
        {
            out.print("HTTP/1.1 500 Internal Server Error\r\n\r\n");
            out.flush();
            out.close();
        }

    }
}

1 ответ

Решение

Вы даете файлу относительный путь и ожидаете, что он волшебным образом найдет файл. Относительные пути определяются относительно того, где была запущена ваша JVM. Если вы хотите абсолютный путь, вам нужно сделать что-то вроде:

new File("C:\\Users\\Gabrielle\\Documents\\NetBeansProjects\\CS2 Assignment 5\\src\\index.html");

Вы не получите это от запроса к вашему приложению, потому что запрос URLEncoded.

Конечно, лучшим решением было бы иметь файл в разумном месте относительно вашего приложения и ссылаться на него относительно.

Другие вопросы по тегам