2012-01-01 3 views
0

Хорошо, я узнаю и реализую, как загружать и извлекать изображения из папки на самой серверной машине. Но я реализую это в папке, которая сама находится в моем каталоге webapp. Я знаю, что это не очень хорошая идея, но что image сервлет с путём /image/* не может получить доступ к папке в каталоге с context путь установлен в server.xml. Коды: Image.java servlet:Как я могу создать новую папку в Tomcat автоматически и использовать ее для хранения загруженных данных?

public class Image extends HttpServlet { 

public static void returnFile(String filename, OutputStream out) 
     throws FileNotFoundException, IOException { 
    // A FileInputStream is for bytes 
    FileInputStream fis = null; 
    try { 
     fis = new FileInputStream(filename); 
     byte[] buf = new byte[4 * 1024]; // 4K buffer 
     int bytesRead; 
     while ((bytesRead = fis.read(buf)) != -1) { 
      out.write(buf, 0, bytesRead); 
     } 
    } finally { 
     if (fis != null) { 
      fis.close(); 
     } 
    } 
} 

@Override 
protected void doGet(HttpServletRequest request, HttpServletResponse response) 
     throws ServletException, IOException { 
    // Use a ServletOutputStream because we may pass binary information 
    ServletOutputStream out = response.getOutputStream(); 

    // Get the file to view 
    String file = request.getPathTranslated(); 

    // No file, nothing to view 
    if (file == null) { 
     out.println("No file to view"); 
     return; 
    } 

    // Get and set the type of the file 
    String contentType = getServletContext().getMimeType(file); 
    response.setContentType(contentType); 

    // Return the file 
    try { 
     returnFile(file, out); 
    } catch (Exception ex) { 
     System.out.print("\n" + ex.getMessage() + "\n"); 
     ex.printStackTrace(); 
    } 
} 

}

context variable:

<Context path="*/photos/users" docBase="G:\myApp\images\users" debug="0" reloadable="true" /> 

Что я хочу, чтобы дать произвольному пути что-то вроде /данных/пользователей рядом с моей веб-приложение в место абсолютного пути G: \ myApp \ images \ users который создается динамически при первом развертывании webapp на любом серверном компьютере Tomcat 6.x/7.x и может использоваться всякий раз, когда я хочу получить доступ к данным внутри него. Надеюсь, я поняла с моим вопросом.

+1

Обратите внимание, что это вне того, что разрешено спецификацией сервлета , Это может вызвать проблемы при переходе на несколько хостов или использовании другого контейнера. –

ответ

1

Вы можете создать каталог, используя File.mkdir или File.mkdirs. Первый создает каталог в назначенном родителе, который уже должен существовать. Второй также создает родительские и каталоги «предков», если это необходимо.

Обратите внимание, что ваше приложение может не работать с достаточными привилегиями для создания каталогов или файлов в произвольных местах. Кроме того, хотя File.mkdirs может создавать несколько каталогов, он не может создавать вещи на несуществующих дисках Windows. Поэтому важно проверить boolean, возвращенный методами mkdir и mkdirs. (А если это false, то есть не так много вы можете сделать об этом!)


Сказав это, я не думаю, что это хорошая идея для веб-приложение, чтобы использовать каталоги вне сети контейнер, не говоря уже о их создании. Как следует из комментария @ Thorbjørn, это может вызвать ряд проблем с переносимостью и платформой, и это может ограничить возможности развертывателя при развертывании вашего webapp (в общем). Существуют также проблемы с песочницей веб-контейнеров ... если разработчик решит это сделать.

Если вы используете файловую систему для сохранения состояния вашего веб-приложения, то лучше всего, чтобы разработчик создал базовый каталог вручную. По крайней мере, он знает, что он создан и где он ... и если он/она получает неправильный путь, webapp может обнаружить это и отказаться начать. (Это также относится к проблеме с привилегиями. Лучше для развертывателя выполнить команду mkdir с повышенными привилегиями, чем она запускает веб-контейнер с повышенной привилегией.)

+0

«привилегия» - хорошая точка. Но проблема в том, что если не знаю, существует ли у сервера существующий каталог C: \ или D: \ или E: \ или что-то еще или какие привилегии предоставляются мне? – Asif

+0

@Asif - см. Обновленный ответ –

Смежные вопросы