2015-10-06 111 views
0

我試圖創建超鏈接,打開從網絡驅動器G文件:打開文件

這是我測試的servlet的一部分:

@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:\

一切工作正常我的本地主機應用服務器。我可以從本地驅動器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 --->其實,這應該工作

凡應該是我之間建立一個差異PC和應用程序服務器?

SOLUTION:

我發現links to network drive doesn't work in standalone Tomcat, but works in Eclipse + Tomcat,所以我必須使用完整的URI:

  • 案例的Eclipse + Tomcat的:路徑G:/test_dir/test.txt工作
  • 案例獨立的Tomcat:路徑\\\\server\\g\\test_dir\\test.txt工程
+0

有你嘗試了服務器上的簡單測試應用程序以及你的開發盒? – NickJ

+0

是的,它同時適用於 – gaffcz

+0

在這種情況下,它可能會檢查'URLDecoder.decode(requestedFile,「UTF-8」)'的結果是什麼 - 也許這是給你一個不存在的文件名 – 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上,它是在集成到Eclipse的tomcat上啓動的。在服務器上它直接部署在Tomcat上。當我嘗試將它直接部署在我的DEV-PC上的tomcat上時,它也不起作用。所以這似乎是另一個問題.. – gaffcz