JAVA POST 使用文件和参数请求 MultiFormData

JAVA POST Request MultiFormData with File and Parameters

我正在尝试使用 "multipart/form-data" 发出 POST 请求,我需要 post 一个文件(下面的代码)和 4 个参数(名称、类别 ...)字符串。

我已经可以使用下面的代码发送文件,但不能使用参数。

    // open a URL connection to the Servlet
    FileInputStream fileInputStream = new FileInputStream(sourceFile);
    URL url = new URL(upLoadServerUri);

    // Open a HTTP  connection to  the URL
    conn = (HttpURLConnection) url.openConnection();
    conn.setDoInput(true); // Allow Inputs
    conn.setDoOutput(true); // Allow Outputs
    conn.setUseCaches(false); // Don't use a Cached Copy
    conn.setRequestMethod("POST");
    conn.setRequestProperty("Connection", "Keep-Alive");
    conn.setRequestProperty("ENCTYPE", "multipart/form-data");
    conn.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + boundary);
    conn.setRequestProperty("fileToUpload", fileName);

    dos = new DataOutputStream(conn.getOutputStream());

    dos.writeBytes(twoHyphens + boundary + lineEnd);
    dos.writeBytes("Content-Disposition: form-data; name=\"fileToUpload\";filename=" + fileName + "" + lineEnd);
    dos.writeBytes(lineEnd);

    // create a buffer of  maximum size
    bytesAvailable = fileInputStream.available();

    bufferSize = Math.min(bytesAvailable, maxBufferSize);
    buffer = new byte[bufferSize];

    // read file and write it into form...
    bytesRead = fileInputStream.read(buffer, 0, bufferSize);

    while (bytesRead > 0) {

        dos.write(buffer, 0, bufferSize);
        bytesAvailable = fileInputStream.available();
        bufferSize = Math.min(bytesAvailable, maxBufferSize);
        bytesRead = fileInputStream.read(buffer, 0, bufferSize);

    }

    // send multipart form data necesssary after file data...
    dos.writeBytes(lineEnd);
    dos.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd);

    // Responses from the server (code and message)
    serverResponseCode = conn.getResponseCode();
    String serverResponseMessage = conn.getResponseMessage();

    Log.i("uploadFile", "HTTP Response is : " + serverResponseMessage + ": " + serverResponseCode);

    if (serverResponseCode == 200) {

        runOnUiThread(new Runnable() {
            public void run() {

                Toast.makeText(PerdidosEAchados.this, "File Upload Complete.",
                        Toast.LENGTH_SHORT).show();
            }
        });
    }

    //close the streams //
    fileInputStream.close();
    dos.flush();
    dos.close();

服务器代码

<?php
echo $_POST["Name"]) ;
echo $_POST["category "]) ;
?>

我试过添加

dos.writeBytes("Content-Disposition: form-data; name=\"Name\";" + lineEnd);
                dos.writeBytes(lineEnd);
dos.writeBytes(Variable);

但是服务器从来不注册参数,请问如何解决?

也许您应该像转发演示代码一样构建 POST 请求?希望对你有帮助。

### Send a form with the text and file fields
POST https://httpbin.org/post
Content-Type: multipart/form-data; boundary=WebAppBoundary

--WebAppBoundary
Content-Disposition: form-data; name="Name"

myName

--WebAppBoundary
Content-Disposition: form-data; name="category"

myCategory

--WebAppBoundary
Content-Disposition: form-data; name="data"; filename=".gitignore"
Content-Type: application/json

< ./.gitignore
--WebAppBoundary--

<> 2019-09-23T045805.200.json

###