Android上载带有http / post并返回消息的文件:$ _FILES为空,但是上载有效

时间:2019-07-12 17:34:51

标签: php android http kotlin http-post

我正在使用Http Post将文件从android应用上传到服务器。另外,我希望服务器将字符串返回给应用程序,但无法使其正常工作。这是上传文件(Kotlin)的android代码:

fun uploadFile(sourceFile: File, url: URL): Boolean {
    var uploadSuccessful = false
    try {
        var conn: HttpURLConnection? = null
        var dos: DataOutputStream? = null
        val lineEnd = "\r\n"
        val twoHyphens = "--"
        val boundary = "*****"
        var bytesRead: Int
        var bytesAvailable: Int
        var bufferSize: Int
        val buffer: ByteArray
        val maxBufferSize = 1 * 1024 * 1024
        if (sourceFile.isFile) {
            try {
                val fileInputStream = FileInputStream(
                    sourceFile
                )
                conn = url.openConnection() as HttpURLConnection
                conn.doInput = true
                conn.doOutput = true
                conn.useCaches = false
                conn.requestMethod = "POST"
                conn.setRequestProperty("Connection", "Keep-Alive")
                conn.setRequestProperty("ENCTYPE", "multipart/form-data")
                conn.setRequestProperty("Content-Type", "multipart/form-data;boundary=$boundary")
                conn.setRequestProperty("userfile", sourceFile.absolutePath)
                dos = DataOutputStream(conn.outputStream)
                dos.writeBytes(twoHyphens + boundary + lineEnd)
                dos.writeBytes("Content-Disposition: form-data; name=\"userfile\";filename=\"" + sourceFile.absoluteFile + "\"" + lineEnd)
                dos.writeBytes(lineEnd)
                // create a buffer of maximum size
                bytesAvailable = fileInputStream.available()
                bufferSize = Math.min(bytesAvailable, maxBufferSize)
                buffer = ByteArray(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
                dos.writeBytes(lineEnd)
                dos.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd)

                // Responses from the server (code and message)
                val serverResponseCode = conn.responseCode
                val serverResponseMessage = conn.responseMessage
                Log.d(TAG, "Server response code: $serverResponseCode, message: $serverResponseMessage")
                if (serverResponseCode == HttpURLConnection.HTTP_OK) {

                    // REQUEST RESPONSE HERE!

                    uploadSuccessful = true
                }
                fileInputStream.close()
                dos.flush()
                dos.close()
            } catch (e: Exception) {
                e.printStackTrace()
            }
        }
    } catch (ex: Exception) {
        ex.printStackTrace()
    }
    return uploadSuccessful


object : AsyncTask<Void, Void, Boolean>() {
    override fun doInBackground(vararg params: Void?): Boolean? {
        return uploadFile(File("/sdcard/some/folder/file.zip"), URL("http://some.server.me/uploadphp/test.php"))
    }
}.execute()

到目前为止,该方法有效。为了获得服务器响应,我尝试添加以下代码(在// REQUEST RESPONSE HERE!处)

val isr = url.openStream()
val reader = BufferedReader(InputStreamReader(isr))
val result = StringBuilder()
var line: String?
while (true) {
    line = reader.readLine()
    if (line == null) {
        break
    }
    result.append(line)
}
Log.d(TAG, "Server returned: $result")

并使用以下PHP脚本(显示$_FILES$_POST$_GET并显示一条消息,说明上传是否成功)

<?php
    print_r($_FILES);
    print_r($_POST);
    print_r($_GET);
    if (is_uploaded_file($_FILES['userfile']['tmp_name'])) {
        $uploads_dir = '/volume2/web/uploadphp/';
        $tmp_name = $_FILES['userfile']['tmp_name'];
        $pic_name = $_FILES['userfile']['name'];
        move_uploaded_file($tmp_name, $uploads_dir.$pic_name);
        echo "File uploaded successfully.";
    } else {
        echo "File not uploaded successfully.";
    }
?>

上传仍然有效(文件已上传),但是服务器返回消息为Array()Array()Array()File not uploaded successfully.,因此显然$_FILES$_GET$_POST数组为空。

如何接收Php从android输出的字符串?为什么即使$_POST为空,上传仍然可以正常工作?

0 个答案:

没有答案