我正在使用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
为空,上传仍然可以正常工作?