隨著移動應用的市場需求越來越大,我們經常需要在Android應用中實現文件上傳到服務器。本文將介紹如何使用Android中的HttpURLConnection類來上傳文件到PHP服務器,同時也會解決一些常見的問題。
首先,我們需要一個PHP服務器來監聽我們的文件上傳請求。下面是一個簡單的文件上傳服務端腳本:
<?php
$target_dir = "uploads/";
$target_file = $target_dir . basename($_FILES["file"]["name"]);
move_uploaded_file($_FILES["file"]["tmp_name"], $target_file);
?>
上傳文件的過程大致分為三步:初始化HttpURLConnection對象、設置請求參數、發送請求。下面是一個完整的上傳文件的示例代碼:
public static void uploadFile(String filePath, String urlServer) {
HttpURLConnection connection = null;
DataOutputStream outputStream = null;
DataInputStream inputStream = null;
String boundary = "*****";
String lineEnd = "\r\n";
String twoHyphens = "--";
int bytesRead, bytesAvailable, bufferSize;
byte[] buffer;
int maxBufferSize = 1 * 1024 * 1024;
try {
File file = new File(filePath);
FileInputStream fileInputStream = new FileInputStream(file);
URL url = new URL(urlServer);
connection = (HttpURLConnection) url.openConnection();
// Allow Inputs & Outputs
connection.setDoInput(true);
connection.setDoOutput(true);
connection.setUseCaches(false);
// Enable POST method
connection.setRequestMethod("POST");
connection.setRequestProperty("Connection", "Keep-Alive");
connection.setRequestProperty("Content-Type",
"multipart/form-data;boundary=" + boundary);
outputStream = new DataOutputStream(
connection.getOutputStream());
outputStream.writeBytes(twoHyphens + boundary + lineEnd);
outputStream
.writeBytes("Content-Disposition: form-data; name=\"file\";filename=\""
+ filePath + "\"" + lineEnd);
outputStream.writeBytes(lineEnd);
bytesAvailable = fileInputStream.available();
bufferSize = Math.min(bytesAvailable, maxBufferSize);
buffer = new byte[bufferSize];
// Read file
bytesRead = fileInputStream.read(buffer, 0, bufferSize);
while (bytesRead >0) {
outputStream.write(buffer, 0, bufferSize);
bytesAvailable = fileInputStream.available();
bufferSize = Math.min(bytesAvailable, maxBufferSize);
bytesRead = fileInputStream.read(buffer, 0, bufferSize);
}
outputStream.writeBytes(lineEnd);
outputStream.writeBytes(twoHyphens + boundary + twoHyphens
+ lineEnd);
// Responses from the server (code and message)
int serverResponseCode = connection.getResponseCode();
String serverResponseMessage = connection.getResponseMessage();
fileInputStream.close();
outputStream.flush();
outputStream.close();
} catch (Exception ex) {
// Exception handling
}
}
我們需要將文件的路徑和服務器的URL傳遞給這個方法即可完成文件上傳。例如,如果我們想上傳名稱為"test.png"的文件到位于"http://example.com/upload.php"的服務器,可以這樣調用:
uploadFile("/sdcard/test.png", "http://example.com/upload.php")
值得注意的是,對于大文件,我們不能直接將整個文件讀入內存中再上傳,而是應該逐步讀取文件,分段上傳,以避免內存溢出的風險。在這個示例中,我們可以通過設置上傳緩沖區的大小來保證上傳的文件不會占用太多內存。
總結一下,通過使用Android中的HttpURLConnection類,我們可以輕松實現文件上傳到PHP服務器。在實際應用中,我們可以通過將這個方法封裝成一個獨立的工具類,以方便我們在其他應用中重用它。同時,在上傳文件之前,我們也需要確保我們的服務器能夠正確地處理文件上傳請求。
上一篇php ppt
下一篇css3banner展示