通过表格将文件从Android上传到GAE

时间:2013-03-09 23:48:31

标签: android google-app-engine blobstore

我在GAE上有一个应用:http://1.myawesomecity.appspot.com/

FIXED:

                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服务器获取ACTUAL上传URL,并按照下面的CORRECT答案的规定传递文件。

旧问题:

正如您所看到的,如果您选择一个文件并点击提交,它将为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?

1 个答案:

答案 0 :(得分:2)

将文件上传到GAE上的blobstore是一个两步过程:

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

  2. 当您拥有blob上传网址时,请在请求中使用它。

  3. 您发送的文件不会显示为NameValuePair,而应该是MultiPartEntity

  4. 这是有效的代码(你需要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);