阅读使用Struts上传的文件

时间:2013-02-14 09:42:42

标签: java jsp servlets struts

我尝试读取通过浏览上传的文件。为此我使用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>

1 个答案:

答案 0 :(得分:1)

请求是请求。

但是,如果你使用Struts 1,实际上使用 Struts 1。

表单,Java端

使用ActionForm FormFile属性:

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等更难以使用)更老,更难以使用。