带文件(图像)的POST请求和带有HttpURLConnection的文本

时间:2016-08-01 02:20:47

标签: php android android-studio curl http-post

我在Bash中使用以下cURL

$ curl -F "image=@/Users/my-name/Downloads/STARinside.jpg_256" -F "assetNumber=OS014005" -F "name=George" -F "make=Hamilton" -F "model=STAR" "http://exampleUrl.compute.amazonaws.com/Asmt3/updateInstrImage.php"

但我似乎无法在Android Studio中使用它。这是我尝试过的一些代码,但我似乎无法开始工作。我可以自己获取所有参数的POST(包括image = @ filename),但看起来服务器(我写的是php)没有像在bash中那样在$_FILES['image']中收到任何内容。或者我可以通过bufferedOutputStream发送实际文件,但是它不会捕获$_POST数组中有意义的任何内容。

此代码的扩展名为AsyncTask,FTR:

HttpURLConnection conn = (HttpURLConnection) this.updateInstr.openConnection();
conn.setDoOutput(true);
conn.setRequestMethod("POST");
//conn.setRequestProperty("Content-Type", "image/jpeg");
conn.setDoInput(true);
params.append("assetNumber=");
params.append(this.asset);
params.append("&name=");
params.append(InstrList.get(this.asset));
params.append("&make=");
params.append(InstrMakes.get(this.asset));
params.append("&model=");
params.append(InstrModels.get(this.asset));
params.append("&image=@");
params.append(image.getAbsoluteFile());
/*
    conn.addRequestProperty("assetNumber", this.asset);
    conn.addRequestProperty("name", InstrList.get(asset));
    conn.addRequestProperty("make", InstrMakes.get(asset));
    conn.addRequestProperty("model", InstrModels.get(asset));
*/
conn.setChunkedStreamingMode(bt.length);
OutputStream out = new BufferedOutputStream(conn.getOutputStream());
byte[] b = params.toString().getBytes(StandardCharsets.US_ASCII);
out.write(b);
out.flush();
out.write(bt);
out.flush();
out.close();

//fully open connection with conn.getInputStream
InputStream in = new BufferedInputStream(conn.getInputStream());
in.read(bytes);
in.close();
response = new String(bytes, "utf-8");
Log.d("response: ", response);

另外,你可以看到,我尝试了另一种方式conn.addRequestProperty。在该实现中,我尝试在bt之后写入b(在FILE之后的POST)。

我非常感谢帮助。我肯定能够在Android Studio中复制这个cURL调用,但我无法理解它。我已经在服务器上的php中添加了一些回应,所以我知道我正确地组装了params(基于$_POST调用print_r($_POST)数组是正确的),但是来自android studio的$_FILES数组是空的(但是从bash-curl开始是正确的)

快速注意,我确实发现this other question非常有用并且几乎足够了,但似乎针对Android讨论的ByteArrayBody类对于Android Studio来说并不存在

1 个答案:

答案 0 :(得分:0)

结果非常复杂,我需要在SO和其他地方散布几个不同的来源(最终)让它发挥作用。

所以,我已经在我的免费亚马逊EC2实例上发布了一个非常详细的例子。如果有人想要获取来源并将其发布到其他地方,我很高兴你这样做,只要你说明原作者。现在:

http://ec2-54-213-243-1.us-west-2.compute.amazonaws.com/How-to/index.html

要点是你需要扩展AsyncTask,但你还需要逐个字符地构建Http请求来描述文件(字节流)与'普通'数据字段的对比。

最涉及的部分是: doInBackground() 哪个电话: writeText()