2010-11-02 91 views
2
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.. 

我正在使用上面的代码读取通过JSP表单上传的.csv文件。代码工作得很好。 但我希望代码是通用格式,因为上面的代码只适用于Windows系统而不是UNIX或任何其他操作系统。如何制作适用于所有操作系统的文件路径通用?

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

为了完成任务,必须更改此特定行。请让我知道可以做什么,以便代码在任何操作系统中都可以正常工作。也请指出上述代码中需要更改的所有区域。

+0

此代码格式非常难读。如何打开IDE的格式化程序? – 2010-11-02 21:29:14

+0

对不起,我没有使用任何IDE。但是要关注的领域是代码的前两行,以及我已经分别提到的位置。 – LGAP 2010-11-02 21:30:53

回答

1

您已经有该文件在file。仅仅通过

new FileReader(file) 

,或者甚至更好替代

new FileReader(fileToBeRead) 

,完全跳过该文件写入磁盘的不必要的步骤,并且立即读取上传的文件流。通过

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

更换

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

您可能需要提供的字符集作为第二个参数。我建议使用UTF-8。

+0

非常感谢。你的答案总是符合我的要求! – LGAP 2010-11-02 22:12:46

1

您的代码已经包含了解决方案:

getServletContext().getRealPath(DESTINATION_DIR_PATH); 

这比要好得多:

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

另一句话:永远不要使用new FileReader(),因为你不能指定所使用的编码将文件的字节转换为所需的字符。改为使用new InputStreamReader(is, encoding)

2

添加到上面的回答中,Servlet代码中的硬编码文件位置不是好的做法,因为它通常会导致Servlet在部署在不同服务器上时不工作,或者Web应用程序直接从压缩的WAR文件运行。从Web应用程序读取资源的正确方法是使用getResource()或getResourceAsStream()方法。这两种方法确保即使Web应用程序部署在多个服务器上或作为压缩的WAR,Servlet也将始终获得对所需资源的访问权限。

的getResourceAsStream(java.lang.String中路径):所述的getResourceAsStream()方法返回的InputStream的实例,以Web应用程序的物理资源。当资源需要逐字读取而不是由Web应用程序处理时,应使用此方法。

的getResource(java.lang.String中路径):所述的getResource()方法返回的URL映射到一个指定的路径的资源。当资源需要被读取时,这个方法应该被使用,因为它会被显示给客户端。

+0

尽管如此,这完全超出了实际问题和功能需求。该操作系统试图读取非常相同的**上传文件,因为他之前写了一些代码行。 – BalusC 2010-11-02 22:03:01