Как сделать Filepath Generic подходящим для всех ОС? - PullRequest
2 голосов
/ 03 ноября 2010
private static final String DESTINATION_DIR_PATH ="/files";
private File destinationDir; 
public void init(ServletConfig config) throws ServletException {
        super.init(config);
        String realPath = getServletContext().getRealPath(DESTINATION_DIR_PATH);
        destinationDir = new File(realPath);
        if(!destinationDir.isDirectory()) {
            throw new ServletException(DESTINATION_DIR_PATH+" is not a directory");
        }

    }

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            PrintWriter out = response.getWriter();
            response.setContentType("text/html");
            out.println();
            DiskFileItemFactory  fileItemFactory = new DiskFileItemFactory ();
            fileItemFactory.setSizeThreshold(1*1024*1024);
            //fileItemFactory.setRepository(tmpDir);
            ServletFileUpload uploadHandler = new ServletFileUpload(fileItemFactory);
            try {
                    List items = uploadHandler.parseRequest(request);
                    Iterator itr = items.iterator();
                while(itr.hasNext()) {
                    FileItem item = (FileItem) itr.next();
                    if(item.isFormField()) {
                        out.println("File Name = "+item.getFieldName()+", Value = "+item.getString());
                    } else {
                        File file = new File(destinationDir,item.getName());
                        item.write(file);
                String fileToBeRead = "C:/ProgramFiles/Apache/Tomcat/webapps/Readcsv/files/"+item.getName();
try {
                            BufferedReader br = new BufferedReader(new FileReader(fileToBeRead));..... and the code goes on..

Я использую приведенный выше код для чтения CSV-файла, загруженного через форму JSP. Код работает отлично. Но я хочу, чтобы код был в общем формате, поскольку приведенный выше код работает только с системой Windows, а не с UNIX или любой другой ОС.

String fileToBeRead = "C:/ProgramFiles/Apache/Tomcat/webapps/Readcsv/files/"+item.getName();

Эта конкретная строка должна быть изменена для выполнения задачи. Пожалуйста, дайте мне знать, что можно сделать, чтобы код работал нормально в любой операционной системе. Также, пожалуйста, укажите все области, в которых необходимо изменить приведенный выше код.

Ответы [ 3 ]

2 голосов
/ 03 ноября 2010

В дополнение к ответам, приведенным выше, жесткое кодирование местоположений файлов в коде сервлета не является хорошей практикой, поскольку обычно сервлет не работает при развертывании на другом сервере или если веб-приложение запускается непосредственно из сжатого файла WAR. Правильный метод чтения ресурса из веб-приложения - использование методов getResource () или getResourceAsStream (). Эти два метода гарантируют, что сервлет всегда получит доступ к нужному ресурсу, даже если веб-приложение развернуто на нескольких серверах или в виде сжатой WAR.

getResourceAsStream (java.lang.String path) : метод getResourceAsStream () возвращает экземпляр InputStream в физический ресурс веб-приложения. Этот метод следует использовать, когда ресурс должен быть прочитан дословно, а не обработан веб-приложением.

getResource (java.lang.String path) : метод getResource () возвращает URL-адрес ресурса, который сопоставлен с указанным путем. Этот метод следует использовать, когда необходимо прочитать ресурс так, как он будет отображаться на клиенте.

1 голос
/ 03 ноября 2010

Ваш код уже содержит решение:

getServletContext().getRealPath(DESTINATION_DIR_PATH);

Это намного лучше, чем:

String fileToBeRead = "C:/Program Files/Apache/Tomcat/...";

Еще одно замечание: никогда не используйте new FileReader(), так как вы не можете указатькодировка, которая используется для преобразования байтов файла в символы, которые вы хотите.Вместо этого используйте new InputStreamReader(is, encoding).

1 голос
/ 03 ноября 2010

У вас уже есть файл в file. Просто замените

new FileReader(fileToBeRead)

от

new FileReader(file)

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

File file = new File(destinationDir,item.getName());
item.write(file);
try {
    BufferedReader br = new BufferedReader(new FileReader(fileToBeRead));

от

try {
    BufferedReader br = new BufferedReader(new InputStreamReader(item.getInputStream()));

Вы можете указать кодировку в качестве второго аргумента. Я бы предложил для этого UTF-8.

...