Java 读取用Struts上传的文件

Java 读取用Struts上传的文件,java,jsp,servlets,struts,Java,Jsp,Servlets,Struts,我试图阅读通过浏览上传的文件。为此,我使用ApacheCommonsFileUpload jar。因此,在使用项目应用程序运行它之前,我只需执行一个成功读取文件的servlet/jsp POC项目。下面是代码 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { boole

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

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版本,并且它使用Java1.4。在Java1.5中,我们假设使用ServletFileUpload而不是FileUpload。但我想,我在哪里可以使用早期版本的jar进行工作并不重要

当我将它用于使用struts 1.1的实际应用程序时,问题就出现了。一切似乎都很好,但我在解析请求时不返回项目

items=upload.parseRequest(请求)

项目在此为空。

因此,我可以发现的区别是,成功显示结果的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">

下面是struts应用程序中唯一添加的内容

    <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>

请求就是请求

但是,如果您使用的是Struts 1,那么实际上应该使用Struts 1

表单,Java端

ActionForm
FormFile
属性一起使用:

public类YourForm扩展了ActionForm{
private FormFile file;//加上公共getter/setter
//等等。
}
您还可以执行验证内容类型之类的操作:

公共ActionErrors验证(ActionMapping映射,HttpServletRequest){ 如果(!“text/plain”.equals(getFile().getContentType())){ //等等。 表单,JSP端


行动

在动作中,你应该把你的文件复制到它的最终目的地(在WebApp外面,使用一个配置参数来定义文件在哪里结束)。考虑使用一个实用程序库来做拷贝(或者移动,也许有几个选项),而不是像在一些教程中所示的那样在动作中做所有的工作。

不要盲目地在不同的环境中使用相同的技术:这项工作是为您处理的


另外,避免在新项目中使用Struts 1。它非常旧,比Struts 2或Spring MVC等更现代的选项更难使用(后者比Rails、Grails、Play等更难使用)

文件是否正确发送到服务器(在浏览器的开发工具中查看post请求)?是,两个请求完全相同。它将文件内容作为post参数发送。内容配置:表单数据;name=“datafile”;filename=“sample.txt”内容类型:text/plain 56444700056300024020563178000563143000I能够使用struts文件属性读取文件。但是奇怪的是,为什么正常的请求解析无法工作。即使我提到了post请求在这两个属性中也是相同的projects@Harshana因为多部分请求是不同的,您需要以不同的方式解析它们,而不是从请求中获取参数。例如,使用Apache Commons FileUpload.yes是我的示例使用它。然后upload.parseRequest(请求);使用正确的post请求和文件内容作为参数返回null(我检查请求)@Harshana如果您使用的是Struts,则不需要手动执行此操作,而且Struts已经解析了请求,这意味着它可能无法再次解析(也不需要解析)。我不明白你现在在做什么。不,我尝试了两种不同的方法。1.使用apache commons fileupload jar,如上面的示例所示,其中我没有像下面那样设置form属性。2.使用struts,通过设置form属性并在=new BufferedReader(new InputStreamReader)中将文件内容作为BufferedReader访问(((FormFile)actionForm.get(“strUploadFile”).getInputStream());