2015-10-06 4 views
0

Я пытаюсь создать гиперссылки для открытия файлов с сетевого диска G:Открыть файл с сетевого диска

Это часть моего тестирования сервлета:

@WebServlet(name="fileHandler", urlPatterns={"/fileHandler/*"}) 
public class FileServlet extends HttpServlet 
{ 
    private static final int DEFAULT_BUFFER_SIZE = 10240; // 10KB. 
    ... 
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
    { 
    String requestedFile = request.getPathInfo(); 
    ... 
    File file = new File("G:/test_dir", URLDecoder.decode(requestedFile, "UTF-8")); // cesta se nacita v kazdem doGet 
    String contentType = getServletContext().getMimeType(file.getName()); 

    response.reset(); 
    response.setBufferSize(DEFAULT_BUFFER_SIZE); 
    response.setContentType(contentType); 
    response.setHeader("Content-Length", String.valueOf(file.length())); 
    response.setHeader("Content-Disposition", "attachment; filename=\"" + file.getName() + "\""); 
    BufferedInputStream input = null; 
    BufferedOutputStream output = null; 

    try 
    { 
     input = new BufferedInputStream(new FileInputStream(file), DEFAULT_BUFFER_SIZE); 
     output = new BufferedOutputStream(response.getOutputStream(), DEFAULT_BUFFER_SIZE); 
     byte[] buffer = new byte[DEFAULT_BUFFER_SIZE]; 
     int length; 
     while ((length = input.read(buffer)) > 0) 
     { 
     output.write(buffer, 0, length); 
     } 
    } 
    finally 
    { 
     close(output); 
     close(input); 
    } 
    } 
} 

Мой HTML компонент:

<a href="fileHandler/test.txt">TEST FILE</a> 

Сетевой диск отображается на сервере приложений, как G:\

Все работает нормально на моем localhost сервер приложений. Я могу открыть файл с локального диска C: и даже с того же сетевого диска G :.

Когда я запускаю приложение JSF на реальном сервере, я могу открывать файлы только с локального диска. Не из G: привод.

Я попытался простой JAVA приложения (чтобы найти, если экземпляр Java имеет доступ к сетевому диску), и она работает на обоих (сервер и dev.PC):

public class Test 
{ 
    static void main(String[] args) 
    { 
    String path = "G:/test_dir/test.txt"; 
    File file = new File(path); 
    System.err.println(file.exists() ? "OK" : "NOK"); 
    } 
} 

я пробовал разные схемы URI:

  • G:/test_dir
  • G:\\test_dir

И следующий не работает вообще:

  • file://server/g:/test_dir
  • ///server/g:/test_dir
  • \\\\server\\g\\test_dir ---> на самом деле, это должно работать

Где должна быть разница между моей разработки ПК и сервер приложений?

РЕШЕНИЕ:

Я обнаружил, что links to network drive doesn't work in standalone Tomcat, but works in Eclipse + Tomcat, так что я должен использовать полный URI:

  • Дело Затмение + Tomcat: Путь G:/test_dir/test.txtработает
  • Case Standalone Tomcat: Путь \\\\server\\g\\test_dir\\test.txt
+0

У вас попробовал простое тестовое приложение на сервере, а также ваш блок разработчиков? – NickJ

+0

Да, он работает на обоих – gaffcz

+0

В этом случае может быть проверка работы, что результат 'URLDecoder.decode (requestFile," UTF-8 ")' is - возможно, это дает вам несуществующее имя файла – NickJ

ответ

1

Если вы можете отлаживать сервер и посмотреть на журналы, попробуйте следующее:

String requestedFile = request.getPathInfo(); 
log.debug('requestedFile='+requestedFile); 
String decodedFilename = URLDecoder.decode(requestedFile, "UTF-8"); 
log.debug('decodedFilename='+decodedFilename); 


File dir = new File("G:/test_dir"); 
log.debug('File g:/test_dir is a dir:'+dir.isDirectory()); 

File file = new File(dir, decodedFilename); 
log.debug('requested file = '+file.getAbsolutePath()); 
log.debug('file exists = '+file.isFile()); 

Если вы не имеете рамки протоколирования настройки, вы можете использовать System.out.println() вместо log.debug(), но это не рекомендуется производство использование.

Это не решит вашу проблему, но вы сможете увидеть, что происходит.

+0

Спасибо, я попробую это завтра! – gaffcz

+0

Я нашел разницу. На моем DEV-PC он запущен на tomcat, интегрированном в Eclipse. На сервере он развернут непосредственно на Tomcat. Когда я пытаюсь развернуть его прямо на tomcat на моем DEV-PC, он также НЕ работает. Так что это, кажется, другой вопрос. – gaffcz

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