2012-04-19 607 views
0

以下是使用PHP上传文件的片段。我是Android开发人员,我想上传文件。这意味着我必须向包含此脚本的URL发送POST请求。POST请求在cURL中成功,但在Java中失败

如果我想上传文件,我应该使用什么参数名称?

PHP

if (file_exists("upload/" . $_FILES["file"]["name"])) { 
    echo $_FILES["file"]["name"] . " already exists. "; 
} else { 
    move_uploaded_file($_FILES["file"]["tmp_name"], "upload/" . $_FILES["file"]["name"]); 
    echo "https://some.site/upload/" . $_FILES["file"]["name"]; 
} 

当我尝试卷曲,该文件被上传成功,但是当我通过Java做到这一点,它失败。

卷曲

curl -F [email protected]_me_now_2.wav http://some.site/upload/ 

Java代码的

File f = new File("call_me_now_11.wav"); 

    HttpPost filePost = new HttpPost("https://some.site/upload/"); 
    FileEntity fileEntity = new FileEntity(f, "audio/wav"); 
    filePost.setEntity(fileEntity); 

    HttpClient client = new DefaultHttpClient(); 
    client.execute(filePost, new BasicResponseHandler() { 

     @Override 
     public String handleResponse(HttpResponse response) 
       throws HttpResponseException, IOException { 
      HttpEntity entity = response.getEntity(); 
      InputStream content = entity.getContent(); 

      int c = 0; 
      StringBuilder builder = new StringBuilder(); 
      while((c = content.read()) != -1) { 
       builder.append((char) c); 
      } 
      System.out.println(builder.toString()); 

      return builder.toString(); 
     } 
    }); 
+0

错误/堆栈跟踪? – 2012-04-19 09:33:20

回答

1

通过this回答。但仍然是一个解释。

无法完成二进制文件读取(作为文本)。这给行尾,nul字符,字符编码带来了问题,并再次使它成为二进制。

一个通常会得到InputStream,这里content,并流出来,没有先读入所有内存。

import org.apache.commons.fileupload.util.Streams; 

OutputStream out = response.getOutputStream(); 
Streams.copy(content, out, false); 

当然,在发布带有文件上传的表单时,请按照提及的答案。

+0

你所建议的是处理响应的另一种方式。你能告诉我如何处理这个请求吗? – 2012-04-23 05:32:03

+0

对不起,重读我的答案我认为它不足。表单输入名称应该是'file'。 – 2012-04-23 09:36:07

+0

解决,这正是我正在寻找的。谢谢。 – 2012-04-23 14:48:48