将带有文件的 cUrl 转换为 Android HttpUrlConnection
Convert cUrl put with file to Android HttpUrlConnection
有几个从 cUrl 转移到 Android 的问题,但 none 我发现处理文件上传的问题。
此 CUrl 请求有效:
$ curl -X PUT -u user:password --data-binary @myfile.pdf "https://example.com/myurl?id=myid&filename=myfile.pdf&title=My+Title&mimetype=application/pdf"
我正在尝试:
String url = "https://example.com/myurl?id=myid&filename=myfile.pdf&title=My+Title&mimetype=application/pdf";
String fileUrl = "myfile.pdf";
String userPassword = "user:password";
String userpass = Base64.encodeToString(userPassword.getBytes(), Base64.DEFAULT);
File f = new File(fileUrl);
if(f.isFile()) {
HttpURLConnection c = null;
URL u = null;
try {
u = new URL(url);
c = (HttpURLConnection) u.openConnection();
c.setRequestProperty("Authorization", "Basic " + userpass);
c.setDoOutput(true);
c.setRequestMethod("PUT");
c.setRequestProperty("Content-Type", "multipart/form-data");
FileInputStream fis = new FileInputStream(f);
long fl = f.length();
output(fis, c.getOutputStream(), fl);
} catch (Exception e) {
e.printStackTrace();
}
其中 output(fis, c.getOutputStream(), fl);
将 inputStream 写入 outputStream,然后 closes/flushes 两者。
我收到 method not allowed
的回复,有人知道我做错了什么吗?
Edit:他们的回复 headers 真的很奇怪(对我来说): Allow: POST,OPTIONS,GET,HEAD
但 PUT
使用 curl 有效.
编辑二:
当使用 curl 我实际上得到:
Access-Control-Allow-Methods: POST, GET, OPTIONS, PUT, DELETE
但是当使用 HttpUrlConnection 时,即使我将 user-agent 设置为 curl 用户代理,也没有 Access-Control-Allow-Methods
使用 c.getHeaderField()
。相反,该字段只是 Allow
,并且缺少 PUT。
好吧,这是愚蠢的。上面的代码没有任何问题,但是 api 显示使用了 .net 域,该域未配置为接受 PUT。当我注意到一切正常时,开发人员向我发送了一个使用 .com 域的 curl 示例。
一个问题是 Android 充满了 mySecretWeirdProtocolHandler()
、NastyBugNobodyCaresAbout.class
和 package.LetMePunchYouInTheFace
之类的东西;所以我最后一次看着所有东西,不知道是我还是他们,度过了一段压力很大的美好时光。
有几个从 cUrl 转移到 Android 的问题,但 none 我发现处理文件上传的问题。
此 CUrl 请求有效:
$ curl -X PUT -u user:password --data-binary @myfile.pdf "https://example.com/myurl?id=myid&filename=myfile.pdf&title=My+Title&mimetype=application/pdf"
我正在尝试:
String url = "https://example.com/myurl?id=myid&filename=myfile.pdf&title=My+Title&mimetype=application/pdf";
String fileUrl = "myfile.pdf";
String userPassword = "user:password";
String userpass = Base64.encodeToString(userPassword.getBytes(), Base64.DEFAULT);
File f = new File(fileUrl);
if(f.isFile()) {
HttpURLConnection c = null;
URL u = null;
try {
u = new URL(url);
c = (HttpURLConnection) u.openConnection();
c.setRequestProperty("Authorization", "Basic " + userpass);
c.setDoOutput(true);
c.setRequestMethod("PUT");
c.setRequestProperty("Content-Type", "multipart/form-data");
FileInputStream fis = new FileInputStream(f);
long fl = f.length();
output(fis, c.getOutputStream(), fl);
} catch (Exception e) {
e.printStackTrace();
}
其中 output(fis, c.getOutputStream(), fl);
将 inputStream 写入 outputStream,然后 closes/flushes 两者。
我收到 method not allowed
的回复,有人知道我做错了什么吗?
Edit:他们的回复 headers 真的很奇怪(对我来说): Allow: POST,OPTIONS,GET,HEAD
但 PUT
使用 curl 有效.
编辑二:
当使用 curl 我实际上得到:
Access-Control-Allow-Methods: POST, GET, OPTIONS, PUT, DELETE
但是当使用 HttpUrlConnection 时,即使我将 user-agent 设置为 curl 用户代理,也没有 Access-Control-Allow-Methods
使用 c.getHeaderField()
。相反,该字段只是 Allow
,并且缺少 PUT。
好吧,这是愚蠢的。上面的代码没有任何问题,但是 api 显示使用了 .net 域,该域未配置为接受 PUT。当我注意到一切正常时,开发人员向我发送了一个使用 .com 域的 curl 示例。
一个问题是 Android 充满了 mySecretWeirdProtocolHandler()
、NastyBugNobodyCaresAbout.class
和 package.LetMePunchYouInTheFace
之类的东西;所以我最后一次看着所有东西,不知道是我还是他们,度过了一段压力很大的美好时光。