我在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来说并不存在
答案 0 :(得分:0)
结果非常复杂,我需要在SO和其他地方散布几个不同的来源(最终)让它发挥作用。
所以,我已经在我的免费亚马逊EC2实例上发布了一个非常详细的例子。如果有人想要获取来源并将其发布到其他地方,我很高兴你这样做,只要你说明原作者。现在:
http://ec2-54-213-243-1.us-west-2.compute.amazonaws.com/How-to/index.html
要点是你需要扩展AsyncTask,但你还需要逐个字符地构建Http请求来描述文件(字节流)与'普通'数据字段的对比。