2012-03-12 6 views
2

私はWebアプリケーションで作業中で、GAE/J blobstoreチュートリアルを使用していますhttp://code.google.com/appengine/docs/java/blobstore/overview.htmlファイルをblobstoreにアップロードできました。GAE/J - Blobstore - ファイルがアップロードされていないかどうかを判断する方法

私の問題は、私の "アップロードファイル"オプションがフォーム上でOPTIONALです。したがって、ユーザーは自分のフォームにファイルをアップロードするかどうかを選択することができます。このフィールドはオプションなので、このフィールドの前処理フォームの検証はありませんが、ユーザーが任意のものを選択したかどうかを判断することができないため、フォームを送信すると "0kbファイルの空白ドキュメントがblobstoreにアップロードされます"サーブレット内にファイルが存在しない。

私はApacheファイルアップロード(ServletFileUpload..etc)を試みましたが、毎回nullを返すようにしました。

サーブレット内にアップロードするファイルがユーザーによって選択されているかどうかを確認するにはどうすればよいですか?

  Map<String, BlobKey> blobs = blobstoreService.getUploadedBlobs(req); 
      if (blobs != null && blobs.size() > 0) { 
       BlobKey blobkey = blobs.get("myFile"); 
       blobkeyStr = blobkey.getKeyString(); 
      } 

答えて

7

ブロブは、サイズをチェックしてアップロードされた場合は、テストすることができますブロブサイズがゼロの場合は、BLOBを削除する必要があります。 DEV環境で

BlobstoreService bs = BlobstoreServiceFactory.getBlobstoreService(); 
BlobKey blobKey = bs.getUploads(req).get("blob").get(0); 
final BlobInfo blobInfo = new BlobInfoFactory().loadBlobInfo(blobKey); 
long size = blobInfo.getSize(); 
if(size > 0){ 
    //process blob 
}else{ 
    bs.delete(blobKey); 
} 
+2

素晴らしいです、ありがとうございます..何とか私のためにblobInfo.getSizeは> 0を返すので、blobInfo.getFilename()によってファイル名を取得してしまいました。ファイルがアップロードされていない場合、長さは常にゼロです。 if(fileName.length()<= 0){blobstoreService.delete(blobkey); } – Jagdish

1

あなたのコードを表示することがさらに役立つ場合があります。

基本的に、ファイルのアップロードはオプションですが、依然としてフォーム提出からblobstoreアップロードURLを介してリクエストを送信する必要があります。ファイルがアップロードされた場合、GAEから制御を取得するアップロードハンドラは、すべてのBLOBのリスト(マップ)を取得できます。アップロードされたファイルがない場合、そのリストは空になります。そこから、フォーム提出の残りの部分を選択して処理することができます。ドキュメントのthis sectionを参照し、アップロードされたブロブのリストを取得する方法の詳細については

が、基本的には、このコールするつもりだ:そのマップが存在し、空の場合

Map<String, BlobKey> blobs = blobstoreService.getUploadedBlobs(req);

をブロブはアップロードされませんでした。

+0

私は質問セクションで上記のコードを更新しました。そして、もしそれがnullか0より大きいかどうかをチェックする条件があっても、コンテンツタイプ "application/octet-stream"の空の "(無名)"ドキュメントをアップロードし、キーを作成します。この例を理解していないか、この状態を正しく検証していない可能性があります。 – Jagdish

+0

私はあなたに何を伝えるべきか分かりません。これは私にとって完璧に機能します。ファイルをアップロードしないと、マップのサイズはゼロになります。 – csturtz

1

アップロードURLに直接送信するフォームを使用しているとしますか?その場合は、フォーム自体に検証コードを追加することができます。フォームを選択した場合は、アップロードURLを取得するために非同期リクエストを行います。添付されたフォームがない場合は、ブロブを処理しない別のURLに送信します。

だから、例えば、フォームが装着されている場合、彼らは、提出したときに、このようなアップロードURLを生成サーブレットに提出:

BlobstoreService service = BlobstoreServiceFactory 
      .getBlobstoreService(); 
    String url = service 
      .createUploadUrl("/uploadurl"); 

    return url; 
+0

デビッドさん、ありがとうございました。 – Jagdish

4

ユーザーが空のファイルをアップロードしてフォームを送信した場合、blobKeyにはnullになりますが、生産にそれがnull以外になり、ブロブは空になります。したがって、両方のシナリオを確認する必要があります。

+1

まさに!私は昨日私のアプリを展開している間にそれを言いました。私のローカルマシンでは、選択されていないファイルのキーは空でした。それについての公式の文書がないのは残念だ –

関連する問題