0

ファイルをアップロードするためのフォームとそのファイルを処理するための jsp を含む単純なページを作成しました。

私の問題は、ファイルがアップロードされると、リクエストオブジェクトがStrutsインターセプターによって処理され、jspページになるとすでに「消費」されているため、「ServletFileUpload.parseRequest()」などのメソッドでリクエストを読み取るための呼び出しです。 " 空のリストを返します。

私はすでに有効な解決策を見つけましたが、これには Tomcat を再起動する必要があり、ページを運用サーバーに追加する必要があるため、再起動しない方法があればもっと良いでしょう。

今のところ、私が試して働いたのはこれです:
1)struts.xmlに追加しました

<include file="custom/struts-custom.xml"/>

2)私が書いたstruts-custom.xmlで:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd">
    <struts>
        <constant name="struts.action.excludePattern" value="/path_to_my_jsp/page.jsp"/>
    </struts>

これにより、Struts インターセプターをバイパスしてファイルをアップロードできます。

より良い/よりクリーンなソリューションはありますか? 私が言ったように、アプリケーション サーバーを再起動する必要のないソリューションが最適です。

問題がコードに関連しているとは思わない場合でも、投稿します。

page.html:

<form action="upload.jsp" method="post" enctype="multipart/form-data" TARGET="Report_Down"
onSubmit="if(document.getElementById('file1').value == '') return false;">
    Input File <input type="file" name="file1" id="file1">
    <input type="submit" value="Upload">
</form>

アップロード.jsp:

boolean isMultipart = ServletFileUpload.isMultipartContent(request);

if (!isMultipart) {
    return;
}

DiskFileItemFactory factory = new DiskFileItemFactory();
factory.setSizeThreshold(1024 * 1024 * 2);
factory.setRepository(new File(System.getProperty("java.io.tmpdir")));
String uploadFolder = getServletContext().getRealPath("")
        + File.separator + DATA_DIRECTORY;

ServletFileUpload upload = new ServletFileUpload(factory);
upload.setSizeMax(1024 * 1024);

try {
    List items = upload.parseRequest(request);

    Iterator iter = items.iterator();
    while (iter.hasNext()) {
        FileItem item = (FileItem) iter.next();

        if (!item.isFormField()) {
            try {
                String fileName = new File(item.getName()).getName();
                String filePath = uploadFolder + File.separator + fileName;
                File uploadedFile = new File(filePath);
                item.write(uploadedFile);

                //do something...
            }
            catch(Exception e) {
                //...
            }
        }
    }

getServletContext().getRequestDispatcher(forwardUrl).forward(
            request, response);

} catch (FileUploadException ex) {
    throw new ServletException(ex);
} catch (Exception ex) {
    throw new ServletException(ex);
}

前もって感謝します :)

4

1 に答える 1