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 上的 blobstore 是一个两步过程:

  1. 首先,您需要获得一个正确的 URL 来发布您的数据,通常人们为此目的使用“/bloburl”处理程序之类的东西

  2. 当您有 blob 上传 URL 时,您可以在请求中使用它。

  3. 您发送的文件不作为NameValuePair,它应该作为MultiPartEntity.

这是有效的代码(您需要 apache http 库来支持 MultiPartEntry):

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 回答