1

写真をアップロードできるアプリケーションがあります。アップロードする写真を選択するためのフォームを含む jsp ページがあります。

subir-foto.jsp

...
<s:form action="SubirFoto" method="post" enctype="multipart/form-data" theme="bootstrap">
   <s:file name="foto" label="Foto" />
   <s:submit value="Upload" align="center" />
</s:form>
...

このフォームでは、ユーザーが特定の種類のファイル (jpg、gif など) のみをアップロードでき、ユーザーが 2 MB を超えるサイズの写真をアップロードできないようにしたいと考えています。

struts.xml

<action
        name="SubirFoto"
        class="impl.redex.presentation.profile.upload.SubirFotosAction">
        <interceptor-ref name="fileUpload">
            <param name="maximumSize">2097152</param>
            <param name="allowedTypes">
                image/png,image/gif,image/jpeg,image/pjpeg
            </param>
        </interceptor-ref>
        <interceptor-ref name="dentroStack"></interceptor-ref>
        <result name="success">/WEB-INF/jsps/foto/foto-subida.jsp</result>
        <result name="input">/WEB-INF/jsps/foto/subir-foto.jsp</result>
</action>

ファイルのアップロードは、1 つのことを除いて完全に機能します。要求された要件を満たしていれば、どんな写真でもアップロードできます。写真ではないファイル (たとえば、プレーン テキスト ファイル) をアップロードしようとすると、アプリケーションはglobal.properties、jsp のフォームの入力で定義したエラーを表示します。

グローバル プロパティ

struts.messages.error.uploading - No se ha podido subir el fichero
struts.messages.error.file.too.large - El fichero es demasiado grande. El tamaño máximo es de 2MB.
struts.messages.error.content.type.not.allowed - Tipo de fichero no aceptado. Sólo es válido si la foto \
está en formato jpg/jpeg, gif o png.

2 MB を超える画像をアップロードしようとすると問題が発生します。アプリケーションはsubir-foto.jspにリダイレクトしますが、jsp ページにエラーは表示されません。

私は少し実験しましたが<s:actionerror />、大きな写真をアップロードするときに subir-foto.jsp を入れると、次のように表示されます。

the request was rejected because its size (17224595) exceeds the configured maximum (2097152)

ご覧のとおり、これは で定義したエラーではありませんglobal.properties

この 2 つの異なるエラー フィールド エラーではないのはなぜですか? これはブートストラップ プラグインの問題ですか? それともStruts2のバグですか?私は何か間違ったことをしていますか?よろしくお願いします。

4

2 に答える 2

5

Googleでさらに検索すると、エラーを説明するブログが見つかりました(ブログエントリは2008年のもので、Struts 2.3.4を使用しています):

http://blog.bielu.com/2008/09/solution-to-struts2-upload-file-error.html

私の問題を解決する方法をまとめます。問題は、メッセージthe request was rejected because its size ...が Struts2 クラスの 1 つでハードコーディングされていることでした。

この問題には、少なくとも 3 つの解決策があります (どれも面倒です)。1 つは、org.apache.struts2.dispatcher.multipart.MultiPartRequestクラスを再実装することです。org.apache.struts2.interceptor.FileUploadInterceptor2 つ目は、クラスを再実装することです。

3 つ目はvalidate 、FileUpload クラスにメソッドを配置したものです。

@Override
public void validate() {
    boolean error = false;

    Collection<?> tmp = getActionErrors();

    for (Object o : tmp) {
        if (o.toString().contains(
                "the request was rejected because its size")) {

            if (!error) {
                addFieldError("foto",
                        "El tamaño de la foto es muy grande (Máximo: 2MB)");
                error = true;
            }
        }
    }

}

とにかく、定義したメッセージが機能しなかった理由をまだ理解できません。なぜなら、検索したすべてのサイトで、struts.messages.error.file.too.largeまたは両方のエラーが異なるタイプのエラー (フィールド エラーとアクション エラー) を上書きするように言われたからです。

お時間をいただきありがとうございました。

于 2012-07-04T07:22:01.897 に答える
0

まず、struts.multipart.maxSize に指定したファイル サイズを超えるファイルをアップロードしようとすると、このエラーが発生します。

非常に簡単な解決策があります。struts.xml で、struts.multipart.maxSize のファイル サイズの値を増やします。

  <constant name="struts.multipart.maxSize" value="50777216000" />
  <param name="maximumSize">15728640</param>

param name="maximumSize"の値を struts.multipart.maxSize の値よりも
小さく してください。上記の場合と同様に、struts.multipart.maxSize の制限を超えない限り、global.properties で定義されたカスタマイズされたエラーが取得されます。したがって、struts を維持するようにしてください。 multipart.maxSize の値を高い範囲に設定します。

于 2012-07-31T11:36:12.157 に答える