将带有文件的 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,HEADPUT 使用 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.classpackage.LetMePunchYouInTheFace 之类的东西;所以我最后一次看着所有东西,不知道是我还是他们,度过了一段压力很大的美好时光。