Esse post tava há um bom tempo como rascunho no blog e só agora consegui terminar para postar aqui. Vou mostrar como fazer uma aplicação Android que faz upload de arquivos para um servidor web.
public class UploadActivity extends Activity {
private TextView txtArquivo;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_upload);
txtArquivo = (TextView)
findViewById(R.id.txtArquivo);
}
// Ao selecionar o arquivo, preenchemos o
// TextView com o caminho real do arquivo
@Override
protected void onActivityResult(int requestCode,
int resultCode, Intent data) {
super.onActivityResult(requestCode,
resultCode, data);
if (resultCode == RESULT_OK) {
if (requestCode == 0) {
Uri selectedImageUri = data.getData();
txtArquivo.setText(getPath(selectedImageUri));
}
}
}
// Botão que abre a galeria de mídia para
// selecionar um arquivo
public void selecionarArquivo(View v){
Intent intent = new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(Intent.createChooser(
intent,"Selecione uma imagem"), 0);
}
// Botão que envia o arquivo selecionado
public void enviarArquivo(View v){
try {
new Thread(){
public void run(){
executeMultipartPost();
}
}.start();
} catch (Exception e) {
Log.e("NGVL", e.getMessage());
}
}
// Obtém o caminho real do arquivo
// através do ContentProvider
public String getPath(Uri uri) {
String[] projection = {
MediaStore.Images.Media.DATA };
Cursor cursor = getContentResolver().query(
uri, projection, null, null, null);
int column_index = cursor.getColumnIndexOrThrow(
MediaStore.Images.Media.DATA);
cursor.moveToFirst();
return cursor.getString(column_index);
}
// Método que realmente envia o arquivo
public void executeMultipartPost()
throws Exception {
String caminhoDoArquivoNoDispositivo =
txtArquivo.getText().toString();
String urlDoServidor =
"http://url_servidor/pagina_que_trata_upload";
String lineEnd = "\r\n";
String twoHyphens = "--";
String boundary = "*****"; // Delimitador
byte[] buffer;
int bytesRead, bytesAvailable, bufferSize;
int maxBufferSize = 1 * 1024 * 1024; // 1MB
try {
// Criando conexão com o servidor
URL url = new URL(urlDoServidor);
HttpURLConnection connection =
(HttpURLConnection) url.openConnection();
// Conexão vai ler e escrever dados
connection.setDoInput(true);
connection.setDoOutput(true);
connection.setUseCaches(false);
// Setando método POST
connection.setRequestMethod("POST");
// Adicionando cabeçalhos
connection.setRequestProperty(
"Connection", "Keep-Alive");
connection.setRequestProperty(
"Content-Type",
"multipart/form-data;boundary=" + boundary);
connection.connect();
// Escrevendo payload da requisição
DataOutputStream outputStream =
new DataOutputStream(
connection.getOutputStream());
outputStream.writeBytes(
twoHyphens + boundary + lineEnd);
outputStream.writeBytes(
"Content-Disposition: form-data; "+
"name=\"uploadedfile\";filename=\""+
caminhoDoArquivoNoDispositivo + "\"" +
lineEnd);
outputStream.writeBytes(lineEnd);
// Stream para ler o arquivo
FileInputStream fileInputStream =
new FileInputStream(new File(
caminhoDoArquivoNoDispositivo));
// Preparando para escrever arquivo
bytesAvailable = fileInputStream.available();
bufferSize = Math.min(
bytesAvailable, maxBufferSize);
buffer = new byte[bufferSize];
// Lendo arquivo e escrevendo na conexão
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);
// Obtendo o código e a mensagem
// de resposta do servidor
int serverResponseCode =
connection.getResponseCode();
String serverResponseMessage =
connection.getResponseMessage();
Log.d("NGVL", serverResponseCode +" = "+
serverResponseMessage);
fileInputStream.close();
outputStream.flush();
outputStream.close();
} catch (Exception ex) {
// Exception handling
}
}
}
O código acima está todo comentado, então vou mostrar o arquivo de layout da aplicação. O único detalhe que eu quero ressaltar, é que utilizei uma Thread apenas pra facilitar o código, mas deveríamos utilizar uma AsyncTask ou até um Service.<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView
android:id="@+id/txtArquivo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Arquivo a ser enviado" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Selecionar arquivo"
android:onClick="selecionarArquivo"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Enviar"
android:onClick="enviarArquivo"/>
</LinearLayout>
A última coisa a fazer é adicionar a permissão de INTERNET no AndroidManifest.xml.
<uses-permission android:name="android.permission.INTERNET"/>A figura abaixo mostra a aplicação em execução:
Qualquer dúvida, deixem seus comentários.
4br4ç05,
nglauber
