Android 无法使用HttpUrlConnection上载文件

Android 无法使用HttpUrlConnection上载文件,android,httpurlconnection,Android,Httpurlconnection,我正在尝试使用UrlConnection将一个zip文件和参数一起上传到我们的服务器。这是上载文件,但不发送参数 这是代码 private static final String CRLF = "\r\n"; // Line separator required by multipart/form-data. private static final String CHARSET_UTF_8 = "UTF-8"; private static final String TWO_HYPHENS =

我正在尝试使用UrlConnection将一个zip文件和参数一起上传到我们的服务器。这是上载文件,但不发送参数

这是代码

private static final String CRLF = "\r\n"; // Line separator required by multipart/form-data.
private static final String CHARSET_UTF_8 = "UTF-8";
private static final String TWO_HYPHENS = "--";


public static void uploadReport(String filePath) {
    File binaryFile = new File(filePath);
    String boundary = Long.toHexString(System.currentTimeMillis()); // Just generate some unique random value.
    String urlString = "https://mycompany.com/api/file/uad.json";

    HttpsURLConnection connection = null;
    DataOutputStream dataOutoutStream = null;
    try {
        URL url = new URL(urlString);
        connection = (HttpsURLConnection) url.openConnection();
        connection.setDoOutput(true);

        connection.setRequestProperty("Connection", "Keep-Alive");
        connection.setRequestProperty("Cache-Control", "no-cache");
        connection.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + boundary);
        OutputStream output = connection.getOutputStream();
        dataOutoutStream = new DataOutputStream(output);

        // Send normal param.
        writeParameter(dataOutoutStream, boundary, "app_name", "My App Name");
        writeParameter(dataOutoutStream, boundary, "app_version", "2.04");

        // Send binary file.
        writeBinaryFile(output, dataOutoutStream, boundary, binaryFile);

        // End of multipart/form-data.
        dataOutoutStream.writeBytes("--" + boundary + "--" + CRLF);

         Log.v(tag, "response code " +  connection.getResponseCode());
    } catch(FileNotFoundException e) {
        e.printStackTrace();
    }  catch(UnsupportedEncodingException e) {
        e.printStackTrace();
    }  catch(IOException e) {
        e.printStackTrace();
    } finally {
        if (dataOutoutStream != null)
            try {
                dataOutoutStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
    }
}
下面是我的writeParameter方法的代码

private static void writeParameter(DataOutputStream dataOutputStream, String boundary, String paramName, String paramValue) throws IOException {
    dataOutputStream.writeBytes(TWO_HYPHENS + boundary + CRLF);
    dataOutputStream.writeBytes("Content-Disposition: form-data; name=\"" + paramName + "\"" + CRLF);
    dataOutputStream.writeBytes("Content-Type: text/plain; charset=" + CHARSET_UTF_8 + CRLF);
    dataOutputStream.writeBytes(CRLF);
    dataOutputStream.writeBytes(paramValue + CRLF);
    dataOutputStream.flush();
}
下面是writeBinaryFile方法

private static void writeBinaryFile(OutputStream output, DataOutputStream dataOutputStream, String boundary, File binaryFile) throws IOException {
        dataOutputStream.writeBytes(TWO_HYPHENS + boundary + CRLF);
        dataOutputStream.writeBytes("Content-Disposition: form-data; name=\"binaryFile\"; filename=\"" + binaryFile.getName() + "\"" + CRLF);
        dataOutputStream.writeBytes("Content-Type: " + URLConnection.guessContentTypeFromName(binaryFile.getName()) + CRLF);
        dataOutputStream.writeBytes("Content-Transfer-Encoding: binary" + CRLF);
        dataOutputStream.writeBytes(CRLF);
        dataOutputStream.flush();
        InputStream input = null;
        try {
            input = new FileInputStream(binaryFile);
            byte[] buffer = new byte[1024];
            for (int length = 0; (length = input.read(buffer)) > 0;) {
                output.write(buffer, 0, length);
            }
            // Important! Output cannot be closed. Close of writer will close output as well.
            output.flush();
        } finally {
        if (input != null) 
            input.close();
        }
        dataOutputStream.writeBytes(CRLF);
        dataOutputStream.flush();
    }
我可以知道我可能做错了什么吗


我确实检查了Stackoverflow POST和。

运行此操作时,您看到了什么?您如何知道未建立连接?当您使用HTTPS时,您的服务器可能需要客户端证书才能连接。我什么也看不到。我在异常块中有调试语句。所有操作都会执行,并转到finally块,不会引发异常。服务器证书不是问题所在,因为我也在不需要证书的服务器上尝试过。我们正在检查服务器上的日志,但我在那里没有看到请求。我之前没有执行getResponseCode调用。现在,它正在发送文件和文件的参数,而不是我的writeParams方法中的其他参数。我更新了我的帖子。你的问题是发送文件还是参数?标题和问题主体不一致!?!我的问题是发送带有参数的文件。不是一个或另一个。但从那以后,我解决了这个问题。