2010-12-06 5 views
3

ファイル選択入力に加えて、テキストエリア、ドロップダウンなどの他の入力フィールドもあるファイルアップロードフォームを希望します。問題は私がどの投稿にもアクセスできないことです私のブロブストアアップロードハンドラのファイル以外のパラメータ。次の関数呼び出しを使用してパラメータ名を取得していますが、常に空の画面が返されます。Googleのappengine blobstoreアップロードハンドラが余分なフォームの投稿パラメータを処理する

PAR = self.request.get( "パー")

私は同様の問題Uploading a video to google app engine blobstoreで別の質問を見つけました。その質問への答えは、あなたの読んでいるパラメータにファイル名を設定するための回避策を提示しています。これは私のニーズには十分ではありません。 blobstoreアップロードハンドラのpostメソッドで他のフォームパラメータにアクセスする方法はありますか?

+0

self.request.get( "par")が正しく表示されます。正しくデバッグしていますか? – systempuntoout

+0

self.request.POST ['par']は機能しますか? –

+1

申し訳ありませんが、私のコードにバグがあるはずです。私は自分が何を変えたのか分からず、私にとってはまったく同じように思えます。そして、self.request.get( "par")とself.request.POST ['par']の両方が機能します。リンクされた質問への答えだけで、これは実際にAPIの問題であったと私に信じていました。 – user434541

答えて

1

あなたは解決策を見つけましたか?

私の経験上、フォーム/マルチパートリクエストを使用する場合、他のパラメータは含まれていないため、手動で掘り起こす必要があります。

これは、ファイルを送信するために使用される要求からパラメータを掘り出す方法です。

import java.util.Map; 
import java.util.HashMap; 
import java.util.Iterator; 
import javax.servlet.http.HttpServletRequest; 

// for reading form data when posted with multipart/form-data 
import java.io.*; 
import javax.servlet.ServletException; 
import org.apache.commons.fileupload.FileItemStream; 
import org.apache.commons.fileupload.FileItemIterator; 
import org.apache.commons.fileupload.servlet.ServletFileUpload; 
import com.google.appengine.api.datastore.Blob; 


// Fetch the attributes for a given model using rails conventions. 
// We need to do this in Java because getParameterMap uses generics. 
// We currently only support one lever: foo[bar] but not foo[bar][baz]. 
// We currently only pull the first value, so no support for checkboxes 
public class ScopedParameterMap { 
    public static Map params(HttpServletRequest req, String model) 
    throws ServletException, IOException {   

     Map<String, Object> scoped = new HashMap<String, Object>();  

     if (req.getHeader("Content-Type").startsWith("multipart/form-data")) { 
     try { 
      ServletFileUpload upload = new ServletFileUpload(); 
      FileItemIterator iterator = upload.getItemIterator(req); // this is used to get those params 

      while (iterator.hasNext()) { 
      FileItemStream item = iterator.next(); 
      InputStream stream = item.openStream(); 

      String attr = item.getFieldName(); 

      if (attr.startsWith(model + "[") && attr.endsWith("]")) { // fetches all stuff like article[...], you can modify this to return only one value 
       int len = 0; 
       int offset = 0; 
       byte[] buffer = new byte[8192]; 
       ByteArrayOutputStream file = new ByteArrayOutputStream(); 

       while ((len = stream.read(buffer, 0, buffer.length)) != -1) { 
       offset += len; 
       file.write(buffer, 0, len); 
       } 

       String key = attr.split("\\[|\\]")[1]; 

       if (item.isFormField()) { 
       scoped.put(key, file.toString()); 
       } else { 
       if (file.size() > 0) { 
        scoped.put(key, file.toByteArray()); 
       } 
       } 
      } 
      } 
     } catch (Exception ex) { 
      throw new ServletException(ex); 
     } 
     } else { 
     Map params = req.getParameterMap(); 
     Iterator i = params.keySet().iterator(); 
     while (i.hasNext()) { 
      String attr = (String) i.next(); 
      if (attr.startsWith(model + "[") && attr.endsWith("]")) { 
       String key = attr.split("\\[|\\]")[1]; 
       String val = ((String[]) params.get(attr))[0]; 
       scoped.put(key, val); 
       // TODO: when multiple values, set a List instead 
       } 
      } 
      } 

     return scoped; 
    } 
    } 

質問がある場合は、このスピーディーな回答が助けてくれることを願っています。

関連する問題