このソリューションは非常によく作成されており、Amazon ec2 でも 100% 動作することがわかりました。次のリンクをご覧ください。
Android で POST を使用して HTTP サーバーにファイルをアップロードする (リンクは削除されました)。
前の回答と比較して、このソリューションではApache から巨大なライブラリをインポートする必要はありません。httpmime
元の記事からコピーされたテキスト:
このチュートリアルでは、Android SDK を使用して HTTP/PHP サーバーにデータ (画像、MP3、テキスト ファイルなど) をアップロードする簡単な方法を示します。
これには、Android 側でアップロードを機能させるために必要なすべてのコードと、ファイルのアップロードと保存を処理する PHP の単純なサーバー側コードが含まれています。さらに、ファイルをアップロードする際の基本的な認証の処理方法についても説明します。
エミュレーターでテストするときは、DDMS またはコマンド ライン経由でテスト ファイルを Android のファイル システムに追加することを忘れないでください。
これから行うことは、リクエストの適切なコンテンツ タイプを設定し、投稿の本文としてバイト配列を含めることです。バイト配列には、サーバーに送信するファイルの内容が含まれます。
以下に、アップロード操作を実行する便利なコード スニペットを示します。このコードには、サーバーの応答処理も含まれています。
HttpURLConnection connection = null;
DataOutputStream outputStream = null;
DataInputStream inputStream = null;
String pathToOurFile = "/data/file_to_send.mp3";
String urlServer = "http://192.168.1.1/handle_upload.php";
String lineEnd = "\r\n";
String twoHyphens = "--";
String boundary = "*****";
int bytesRead, bytesAvailable, bufferSize;
byte[] buffer;
int maxBufferSize = 1*1024*1024;
try
{
FileInputStream fileInputStream = new FileInputStream(new File(pathToOurFile) );
URL url = new URL(urlServer);
connection = (HttpURLConnection) url.openConnection();
// Allow Inputs & Outputs.
connection.setDoInput(true);
connection.setDoOutput(true);
connection.setUseCaches(false);
// Set HTTP method to POST.
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=\"uploadedfile\";filename=\"" + pathToOurFile +"\"" + 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)
serverResponseCode = connection.getResponseCode();
serverResponseMessage = connection.getResponseMessage();
fileInputStream.close();
outputStream.flush();
outputStream.close();
}
catch (Exception ex)
{
//Exception handling
}
ファイルのアップロード中にユーザー名とパスワードでユーザーを認証する必要がある場合は、以下のコード スニペットにその追加方法を示します。必要なのは、接続の作成時に Authorization ヘッダーを設定することだけです。
String usernamePassword = yourUsername + “:” + yourPassword;
String encodedUsernamePassword = Base64.encodeToString(usernamePassword.getBytes(), Base64.DEFAULT);
connection.setRequestProperty (“Authorization”, “Basic ” + encodedUsernamePassword);
PHP スクリプトがサーバー側でデータを受信する役割を担っているとしましょう。このような PHP スクリプトのサンプルは次のようになります。
<?php
$target_path = "./";
$target_path = $target_path . basename( $_FILES['uploadedfile']['name']);
if(move_uploaded_file($_FILES['uploadedfile']['tmp_name'], $target_path))
{
echo "The file ". basename( $_FILES['uploadedfile']['name']).
" has been uploaded";
}
else
{
echo "There was an error uploading the file, please try again!";
}
?>;
コードは Android 2.1 および 4.3 でテストされました。サーバー側でスクリプトに権限を追加することを忘れないでください。そうしないと、アップロードが機能しません。
chmod 777 uploadsfolder
uploadsfolder は、ファイルがアップロードされるフォルダーです。デフォルトの 2MB のファイル サイズ制限を超えるファイルをアップロードする場合。php.ini ファイルの upload_max_filesize 値を変更する必要があります。