0

テキストとファイルタイプの入力フィールドを含むフォームを送信し、このコードを使用してテキストデータを取得しています

しかし、問題はそれです

List<FileItem> items = new ServletFileUpload(new DiskFileItemFactory()).parseRequest(request);
for (FileItem item : items) {
if (item.isFormField()) {
    // Process normal fields here.
    //Taking all text and doing task
    System.out.println("Field name: " + item.getFieldName());
    System.out.println("Field value: " + item.getString());
} else {
    // Process <input type="file"> here.
    //And Leaving this at this time

}            
}

リクエストを解析し、それを 1 つずつ反復処理してから、formField ですべてのテキスト パラメータを取得し、その後、このコードをファイル タイプ条件で再度使用してファイルをアップロードし、再度解析しないようにします。

List<FileItem> items = new ServletFileUpload(new DiskFileItemFactory()).parseRequest(request);
for (FileItem item : items) {
if (item.isFormField()) {
// Process normal fields here.
//Leaving this section this time
} else {
// Process <input type="file"> here.
//Use to Upload file
System.out.println("Field name: " + item.getFieldName());
System.out.println("Field value (file name): " + item.getName());
}            
}

それで、なぜそれが起こっているのか...そして、これに対する解決策は何ですか...????

4

1 に答える 1

5

HTTP 要求は、クライアントが 1 回しか送信していないため、解析できるのは 1 回だけです。HTTP リクエストは、最初の解析中にすでに完全に消費されています。同じリクエストに対する後続の解析試行中は使用できなくなります。

2回解析したい場合、クライアントは基本的に2回送信する必要があります。ただし、クライアントにそれを依頼/期待することはできません。それはまったく意味がありません。一度解析して、具体的な機能要件に対する別のソリューションを探してください。たとえばitems、両方のループで同じリストを再利用します。

List<FileItem> items = new ServletFileUpload(new DiskFileItemFactory()).parseRequest(request);

for (FileItem item : items) {
    if (item.isFormField()) {
        // Process normal fields here.
    }
}            

for (FileItem item : items) {
    if (!item.isFormField()) {
        // Process file fields here.
    }
}            

これは基本的に非効率的なコードであることに注意してください。したがって、機能要件についてもう一度考え直します。

于 2013-02-20T15:00:03.880 に答える