0

我尝试读取通过浏览上传的文件。为此,我正在使用 apache commons fileupload 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,并且它使用 java 1.4。对于 java 1.5,我们假设使用 ServletFileUpload 而不是 FileUpload 。但我想我可以在哪里使用更早版本的 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">

下面是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>
4

1 回答 1

1

请求就是请求。

但是,如果您使用的是 Struts 1,请实际使用Struts 1。

表单,Java 端

将 anActionFormFormFile属性一起使用:

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

那个行动

在操作中,您应该将文件复制到其最终目的地(在 webapp之外;使用配置参数来定义文件的最终位置)。考虑使用实用程序库来进行复制(或移动,可能有几个选项),而不是像某些教程中所示的那样完成动作中的所有工作。

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

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

此外,避免将 Struts 1 用于新项目。它比 Struts 2 或 Spring MVC 等更现代的选项(反过来又比 Rails、Grails、Play 等更难使用)更古老且更难使用。

于 2013-02-14T13:14:16.583 回答