0

upload.parseRequest を送信するときにファイルを選択した後、Excel のファイル アップロード、つまり xls タイプのドキュメントを実装しています。空のリストが返されます。

List<FileItem> items = (List<FileItem>)upload.parseRequest(request)

以下は、レビュー用の CommonsFileUploadServlet.java です -

import java.io.File;
import java.io.IOException;
import java.util.Iterator;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

public class CommonsFileUploadServlet extends HttpServlet {

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        File fullFile = null;
        FileItem item = null;
        int FILE_SIZE = 2097152;
        try {
            boolean isMultipart = ServletFileUpload.isMultipartContent(request);

            if (isMultipart) {
                FileItemFactory factory = new DiskFileItemFactory();
                ServletFileUpload upload = new ServletFileUpload(factory);
                List<FileItem> items = (List<FileItem>) upload.parseRequest(request);
                System.out.println("Number of fields: " + items.size());
                Iterator<FileItem> itr = items.iterator();
                String msg = "";

                while (itr.hasNext()) {
                    try {
                        item = (FileItem) itr.next();

                        if (item.isFormField()) {
                            String fieldName = item.getFieldName();
                            if (fieldName.equals("name")) {
                                request.setAttribute("msg", "Thank You: " + item.getString());
                            }
                        } else {
                            String path = request.getParameter("path");
                            String field = request.getParameter("field");
                            System.out.println("path >>" + path + "<br/><br/>");
                            fullFile = new File(item.getName());
                            String imageName = fullFile.getName();
                            File f = new File(path);
                            f.mkdirs();
                            File savedFile = new File(path + "/", imageName);
                            fullFile = uniqueFile(savedFile, path);
                            item.write(fullFile);
                            msg = "file uploaded successfully";
                        }
                    } catch (Exception e) {
                        e.printStackTrace();
                        msg = "Problem occured while uploading file.<br>Please try again";
                    }
                }
            } else {
                System.out.println("not a multipart request");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public File uniqueFile(File f,String pa) {

        return f;       
    }

}

dataMigration.jsp は以下のとおりです。

<body>
        <center>
            <form action="upload.jsp?path=<%=path%>&field=<%=field%>" name="form" method="POST" enctype="multipart/form-data">
                <b><font face=verdana size=2>Upload File:<br><br></font></b>
                <input type="file" name="uploadFile" id="uploadFile"/><br><br>
                <input type="submit" name="Submit" value="Submit" onclick="return callCheck();"/>
            </form>
        </center>
    </body>

以下のようにデバッグ分析を見つけてください -

  1. 変数の下のデバッグモードでは、リクエスト変数がマルチ - ファイル - テーブルにファイルを持っていることがわかります
  2. しかし、items 変数は空です。つまり、modcount = 0 & size = 0 です。

web.xml ファイル -

<web-app id="WebApp_9" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
    <display-name>MySystem</display-name>
    <filter>
        <filter-name>struts2</filter-name>
        <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
        <init-param>
            <param-name>actionPackages</param-name>
            <param-value>com.emsproject</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>struts2</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    <listener>
        <listener-class>org.apache.struts2.tiles.StrutsTilesListener</listener-class>
    </listener>
    <listener>
        <description>sessionListener</description>
        <listener-class>com.emsproject.action.common.SessionListener</listener-class>
    </listener>
    <context-param>
        <param-name>tilesDefinitions</param-name>
        <param-value>/WEB-INF/tiles.xml</param-value>
    </context-param>
    <welcome-file-list>
        <welcome-file>/jsp/common/index.html</welcome-file>
    </welcome-file-list>
    <servlet>
        <servlet-name>SysInfo</servlet-name>
        <servlet-class>com.emsproject.action.common.SysInfoServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>SysInfo</servlet-name>
        <url-pattern>/eapp/*</url-pattern>
    </servlet-mapping>
</web-app>

考えられる多くの代替案を試しましたが、parseRequest メソッドは空のリストを返します

私は一日中この問題に苦労しているので、この点で親切に助けてください:(私はs:file、つまりstruts fileupload機能を使用したくありません

ありがとう

4

1 に答える 1

0

私が直面した問題の解決策を見つけました @

http://grokbase.com/t/struts/user/095ewvh02e/file-upload-jupload-how-to-disable-struts2-fileupload-interceptor

上記の投稿から機能したもの:) -

最後に、struts2 フィルター マッピングを "/ " から " .action" に安全に変更し、今日、redback struts2 を既存の webapp とマージすることに成功しました。

私はこれを試してみました.S2ファイルアップロードインターセプターは干渉しませんでした.S2を使用するすべてのアクションには* .action拡張子があります.

Roman C & Dave さん、お時間とご尽力に感謝いたします。

pshinde31

于 2013-09-09T04:59:35.233 に答える