2013-02-14 56 views
0

我尝试读取通过浏览上传的文件。为此,我使用apache commons fileupload jar。因此,在使用项目应用程序运行之前,我只需执行一个成功读取文件的servlet/jsp POC项目。下面是代码,阅读使用Struts上传的文件

protected void doPost(HttpServletRequest request, 
      HttpServletResponse response) throws ServletException, IOException { 

     boolean isMultipart = FileUpload.isMultipartContent(request); 
     String content = ""; 

     try { 
      if (isMultipart) { 
       FileItemFactory factory = new DefaultFileItemFactory(); 
       FileUploadBase upload = new FileUpload(factory); 
       String[] arr; 
       List items; 

       items = upload.parseRequest(request); 

       Iterator iter = items.iterator(); 
       while (iter.hasNext()) { 
        FileItem item = (FileItem) iter.next(); 
        if (!item.isFormField()) { 
         BufferedInputStream buff = new BufferedInputStream(
           item.getInputStream()); 
         byte[] bytes = new byte[buff.available()]; 
         buff.read(bytes, 0, bytes.length); 
         content = new String(bytes); 
         arr = content.split(","); 

        } 
       } 
      } 

      request.getRequestDispatcher("success.jsp").forward(request, 
        response); 
     } catch (FileUploadException e) { 

     } 

我有使用jar版本1.1因为我的项目目录有该版本的jar和它使用java 1.4。在java 1.5中,我们假设使用ServletFileUpload而不是FileUpload。但我想这不重要,我可以用jar的jar版本来做这件事。

问题来了,当我用它与真正的应用程序使用struts 1.1。所有似乎都很好,但我解析请求时不返回项目。

items = upload.parseRequest(request);

项目在这里是空的。

所以我能找到的差异是成功显示结果的POC项目是一个JSP/Servlet项目,其中真正的应用程序使用Struts。

这种情况下,JSP/Servlet和Struts项目中的请求会有所不同吗?

在这两种情况下,我使用下面的形式。

<form action="SampleWeb" method="post" enctype="multipart/form-data"> 
<input type="file" name="datafile" size="40"> 
<input type="submit" value="Submit"> 

下面是在支柱应用的唯一此外,

<action 
     path="/ReportsAction" 
     type="come.test.ReportsAction" 
     name="ReportsForm" 
     scope="request" 
     validate="false" 
     parameter="dispatch"> 
     <forward name="success" path="/reports/A.jsp"/> 
     <forward name="updatesuccess" path="/common/B.jsp"/>    
    </action> 
+0

是否正确地将文件发送到服务器(在浏览器的开发者工具中查看发布请求)? – Uooo 2013-02-14 10:28:37

+0

是这两个请求都是相同的。它将文件内容作为发布参数发送。内容处理:表单数据; NAME = “数据文件”; filename =“sample.txt” Content-Type:text/plain 564447000,563000240,563178000,563143000 – Harshana 2013-02-17 16:00:26

回答

1

的请求是一个请求。

不过,如果你使用Struts 1,实际上使用的Struts 1

表单,Java方面

使用ActionFormFormFile属性:

public class YourForm extends ActionForm { 
private FormFile file; // Plus public getter/setter 
    // Etc. 
} 

你也可以做一些事情来验证内容类型:

public ActionErrors validate(ActionMapping mapping, HttpServletRequest request) { 
    if (!"text/plain".equals(getFile().getContentType())) { 
     // etc. 

形式JSP侧

<html:form action="/uploadAction" method="post" enctype="multipart/form-data"> 
    <html:file property="file" /> 
    <!-- Etc... --> 

行动

在操作您应该将文件复制到它的最终目的地( web应用程序;使用配置参数来定义文件最终位置)。考虑使用实用程序库来执行复制(或者移动,也许有几个选项),而不是执行某些教程中显示的操作中的所有工作。

http://www.mkyong.com/struts/struts-file-upload-example/

不要盲目使用相同的技术在不同环境:这项工作是处理你。

此外,避免在新项目中使用Struts 1。这比使用Struts 2或Spring MVC等更现代的选项要困难得多(它比Rails,Grails,Play等更难使用)

+0

我能够使用struts文件属性读取文件。 但令人惊讶的是为什么普通的请求解析不起作用。即使正如我所提到的,这两个项目中的发布请求也是相同的 – Harshana 2013-02-18 16:26:06

+0

@Harshana由于多部分请求不同,您需要以不同的方式解析它们,而不是从请求中获取参数。例如,使用Apache Commons FileUpload。 – 2013-02-18 16:28:39

+0

是的我的例子使用它。然后upload.parseRequest(request);以文件内容作为参数返回null(包含文件内容作为参数) – Harshana 2013-02-19 00:21:16