2016-04-21 1 views
1

私は、HTMLフォームを処理するために、Javaサーブレットを使用していますが、それは、ファイルの入力要素が含まれていますなぜ、サーブレットは空のHTMLファイル要素にファイルがあると思うのですか?

<input type="file" id="fileUpload" name="file" multiple /> 

私は一度に複数のファイルを処理するためにthis excellent answerでサンプルコードを使用していました。私が使用しているコードは:

List<Part> fileParts = req.getParts().stream().filter(part -> "file".equals(part.getName())).collect(Collectors.toList()); // Retrieves <input type="file" name="file" multiple="true"> 
for (Part filePart : fileParts) { 
      String fileName = filePart.getSubmittedFileName(); 
      InputStream fileContent = filePart.getInputStream(); 
      // Do stuff here 
} 

このコードはうまくいきます。私の問題は、何も付いていないとき、私のコードはまだfilePartsにPartオブジェクトがあると考えているということです。一部のデバッグを行うと、Partオブジェクトはそこにあるように見えますが、私はファイルをアップロードしていないので、取得するInputStreamまたはSubmittedFileNameはありません。どうしてこれなの?私はラムダ関数とコレクションを初めて使っていますが、アップロードするファイルを選択しないと、この "fileParts" Collectionは空でなければなりません。

+1

は、ブラウザのネットワークコンソールをチェックしてください。それは空の入力を提出しますか?それでも有効です。 – Savior

答えて

1

これはHTMLの動作方法です。

ファイル以外の入力についても同様です。空の入力が提出されると、nullではなく空の値が得られます。違いは重要です。 nullの値は入力フィールドがないことを示します。これは、フォームに複数の送信ボタンがあり、ボタンを押したときにdistinguishにしたい場合に特に便利です。 <input type="text" name="foo">

String foo = request.getParameter("foo"); 

if (foo == null) { 
    // foo was not submitted at all. 
} else if (foo.isEmpty()) { 
    // foo is submitted without value. 
} else { 
    // foo is submitted with a value. 
} 

そして<input type="file" name="bar">考える

Part bar = request.getPart("bar"); 

if (bar == null) { 
    // bar was not submitted at all. 
} else if (bar.getSize() == 0) { 
    // bar is submitted without value. 
} else { 
    // bar is submitted with a value. 
} 
関連する問題