1

私はGAEにアプリを持っています:http://1.myawesomecity.appspot.com/

修繕:

                HttpPost post = new HttpPost("http://1.myawesomecity.appspot.com/");
                http_client.getParams().setParameter(CoreProtocolPNames.PROTOCOL_VERSION, HttpVersion.HTTP_1_1);
                String result = EntityUtils.toString( http_client.execute(post).getEntity(), "UTF-8");
                String actualURL = result.substring(result.indexOf("http://"), result.indexOf("\" method"));
                Log.w("asdf", "url " + actualURL );


                post = new HttpPost(actualURL);
                http_client.getParams().setParameter(CoreProtocolPNames.PROTOCOL_VERSION, HttpVersion.HTTP_1_1);                    
                MultipartEntity entity = new MultipartEntity( HttpMultipartMode.BROWSER_COMPATIBLE );
                String mime_type = "image/png";
                File file = new File( filename ); //context.getFilesDir(), 
                entity.addPart( "myFile", new FileBody( file, mime_type));
                post.setEntity( entity );

                String res = EntityUtils.toString( http_client.execute(post).getEntity(), "UTF-8");
                Log.w("asdf", res);

上記は、GAEサーバーから実際のアップロードURLを取得し、以下の正しい回答で示されているようにファイルを渡します。

古い質問:

ご覧のとおり、ファイルを選択して[送信]をクリックすると、404になりますが、ファイルは実際に保存されます(大きすぎない限り、100kb未満)。最初のテキストフィールドには何も入力しないでください。

さて、この特定のアプリがほとんど機能していないことはさておき、Androidからこのサーバーにファイルをアップロードしようとしています。

サイトのアップロードスクリプトはblobstoreを使用し、ファイルフィールドの名前は「myFile」です。

今私のAndroidアプリでは、私は持っています:

    HttpClient httpclient = new DefaultHttpClient();

    HttpPost httppost = new HttpPost(<my app's url>);

    List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
    nameValuePairs.add(new BasicNameValuePair("myFile", <path to a file selected by user> ) );
    httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));

    httpclient.execute(httppost);

これは例外をスローします。

これは、ブラウザを介して自分のサイトにアクセスし、ファイルを選択して送信を押すのとどう違うのですか?Androidコードでは実行されないのに、ブラウザを通過すると実際にファイルのアップロードが実行されるのはなぜですか?

ファイルパスが有効であることを知っています。私が間違っていることはありますか?または、Androidからhttpclientを実行するのとは異なるブラウザから「送信」をクリックしますか?

4

1 に答える 1

2

GAE のブロブストアにファイルをアップロードするには、次の 2 つの手順を実行します。

  1. まず、データを POST する適切な URL を取得する必要があります。通常、人々はその目的のために "/bloburl" ハンドラーのようなものを使用します。

  2. blob アップロード URL がある場合は、それをリクエストで使用します。

  3. あなたが送信したファイルは ではなく、 として送らNameValuePairれるはずMultiPartEntityです。

動作するコードは次のとおりです (MultiPartEntry をサポートするには、apache http ライブラリが必要です)。

DefaultHttpClient http_client = new DefaultHttpClient();
HttpGet http_get = new HttpGet(Config.BASE_URL + "bloburl");
HttpResponse response = http_client.execute(http_get);
BufferedReader reader = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
String first_line = reader.readLine();
Log.w(TAG, "blob_url: " + first_line);

HttpPost post = new HttpPost(first_line);
http_client.getParams().setParameter(CoreProtocolPNames.PROTOCOL_VERSION, HttpVersion.HTTP_1_1);
MultipartEntity entity = new MultipartEntity( HttpMultipartMode.BROWSER_COMPATIBLE );

mime_type = "application/zip";
File file = new File( context.getFilesDir(), filename );
entity.addPart( "file", new FileBody( file, mime_type));
post.setEntity( entity );

String result = EntityUtils.toString( http_client.execute(post).getEntity(), "UTF-8");
Log.i(TAG, result);
于 2013-03-10T02:23:32.253 に答える