1

通常のテキスト入力とファイルのアップロードで構成されるフォームがあります。

<portlet:actionURL var='create' name="addProduct">
</portlet:actionURL>    
<form id="addform" action="<%=create%>" method="post" enctype="multipart/form-data">

    <dl class="dl-horizontal">
        <dt>Product Name</dt>
        <dd>
            <input type="text"  name="name"  />
        </dd>
        <dt>Image File</dt>
        <dd>
            <input type="file" name="imgFile" >
        </dd>
    </dl>
        <button type="submit">Save</button>
</form>

ポートレットクラスで、アップロードしたファイルとパラメータ「名前」にアクセスしたい。enctype="multipart/form-data" をフォームに入れると、 request.getParameter("name")またはParamUtil.getString(request,"name ) でその他 (ここでは "name" パラメータ) を取得できないことがわかりました")

enctype="multipart/form-data" を削除すると、「name」パラメーターが表示されますが、もちろんアップロードされたファイルは失われます。アップロードされたファイルと通常のパラメーターの両方を取得するにはどうすればよいですか

編集:私のアクションの実装は:

@ProcessAction(name = "addProduct")
public void addProduct(ActionRequest request, ActionResponse response) {
        String name = ParamUtil.getString(request,"name");
            String anotherTryForName = request.getParameter("name");
        System.out.println(name);
            System.out.println(anotherTryForName);
        System.out.println(uploadImg(request));
}
private String uploadImg(ActionRequest request) {

        String realPath = getPortletContext().getRealPath("/");
        byte[] bytes = null;
        try {

            UploadPortletRequest uploadRequest = PortalUtil
                    .getUploadPortletRequest(request);
            String sourceFileName = uploadRequest.getFileName("imgFile");
            File file = uploadRequest.getFile("imgFile");
            try {
                bytes = FileUtil.getBytes(file);
            } catch (IOException e2) {
                e2.printStackTrace();
            }
            File newFile = null;

            if ((bytes != null) && (bytes.length > 0)) {

                try {
                    newFile = new File(realPath + "demo/productimg/"
                            + sourceFileName);
                    FileInputStream fileInputStream = new FileInputStream(file);
                    FileOutputStream fileOutputStream = new FileOutputStream(
                            newFile);
                    fileInputStream.read(bytes);
                    fileOutputStream.write(bytes, 0, bytes.length);
                    fileOutputStream.close();
                    fileInputStream.close();
                } catch (FileNotFoundException e) {
                    System.out.println("File Not Found.");
                    e.printStackTrace();
                } catch (IOException e1) {
                    System.out.println("Error Reading The File.");
                    e1.printStackTrace();
                }
            }
            return sourceFileName;
        } catch (Exception e) {
            System.out.println("Exception::::" + e.getMessage());
            return "";
        }
}
4

2 に答える 2

3

フォームが multipart/form-data の場合、ActionRequest ではなく UploadPortletRequest から追加のパラメーター (「名前」など) を取得する必要があることがわかりました。

パラメータ取得の正しい形式:

UploadPortletRequest uploadRequest = PortalUtil
                    .getUploadPortletRequest(request);
String name = ParamUtil.getString(uploadRequest,"name");
于 2013-08-28T08:08:04.067 に答える
1

ポートレット アクションに投稿するとき、パラメーターはポートレットに名前空間を設定する必要があります。試す

 <input type="text" name="<portlet:namespace/>name"/>
 ...
 <input type="file" name="<portlet:namespace/>imgFile"/>

あるいは、aui taglib を使用することもできます。

 <aui:form ...>
    <aui:input ... name="name"/>
 </aui:form>

この taglib は名前空間を自動的に追加します

于 2013-08-27T13:37:21.393 に答える