我在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?
答案 0 :(得分:2)
将文件上传到GAE上的blobstore是一个两步过程:
首先你需要获得一个正确的URL来发布你的数据,通常人们会为此目的使用类似“/ bloburl”处理程序的东西
当您拥有blob上传网址时,请在请求中使用它。
您发送的文件不会显示为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);