Android ile İnternetten Dosya İndirmek ve Sunucuya Dosya Göndermek
Selamlarla, bu yazımızda Android uygulamalarınızda internetten dosya indirme (download) ve sunucuya dosya gönderme (upload) işlemlerini progress dialoglu şekilde yapacağız.
[wpdm_file id=15]Progress Dialog nedir?
Progress Dialog, uygulamanıza bir iş yaptırırken kullanıcıya “İşleminiz yapılıyor lütfen bekleyin” türünde mesajlar göstermek için veya işlemin % kaçının bittiğinden kullanıcıyı haberdar etmek için kullanılan bir arayüz bileşenidir.
Web Sunucu ile nasıl haberleşeceğiz?
Kütüphaneyi sayfasından Download butonuna tıklayarak indirip, Android projenizde libs dizinine aşağıdaki gibi yerleştirin.
Projemizi oluşturmaya başlayalım.
- Yeni bir proje oluşturun File ⇒ New ⇒ Android Project
- İndirdiğiniz android-async-http-*.jar dosyasını libs altına kopyalayın.
- activity_main.xml dosyasını açın. Aşağıdaki arayüz kod parçasını içerisine yapıştırın.
Arayüzümüzde 2 buton var, ve butonlara dokunulduğunda çağrılacak metodları android:onClick ile belirttik.<RelativeLayout 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:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context=".MainActivity" > <Button android:id="@+id/button1" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_alignParentTop="true" android:layout_centerHorizontal="true" android:text="Dosyayı İndir" android:onClick="onClickDosyaIndir" /> <Button android:id="@+id/button2" android:layout_marginTop="20dip" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_alignRight="@+id/button1" android:layout_below="@+id/button1" android:text="Dosyayı Sunucuya Gönder" android:onClick="onClickDosyaGonder"/> </RelativeLayout>
- MainActivity.java dosyasını açın, içerisine aşağıdaki kodları yapıştırın. Kod içerisine açıklamalar ekledim.
public class MainActivity extends Activity { // internetten indirilecek olan dosyanın adresi String indirilecekDosyaAdresi = "http://androidevreni.com/api/android/fotograf.jpg"; // dosya indirildikten sonra hangi yola kaydedilecek. String dosyaKayitYeri = "/sdcard/fotograf.jpg"; // dosya sunucuya gönderilirken (upload) hangi adres kullanılacak String uploadAdresi = "http://androidevreni.com/api/android/upload.php"; // upload download işlemlerinin % olarak göstermek için kullanılacak progress dialog ProgressDialog pDialog; // indirdiğimiz dosyayı byte şeklinde saklayacağımız değişken byte[] inenDosya; // get ve post işlemleri yapacağımız AsyncHttpClient nesnesi final AsyncHttpClient client = new AsyncHttpClient(); // dosya gönderirken dosyayı iliştireceğimiz nesne. final RequestParams params = new RequestParams(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); pDialog = new ProgressDialog(this); pDialog.setIndeterminate(false); pDialog.setMax(100); pDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); pDialog.setCancelable(true); } public void mesajGoster(String mesaj) { Toast.makeText(getApplicationContext(), mesaj, Toast.LENGTH_LONG) .show(); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main, menu); return true; } }
- Dosya indirme/download butonuna dokunulduğunda çalışacak olan aşağıdaki metodu MainActivity.java dosyanıza yerleştirin.
public void onClickDosyaIndir(View v) { pDialog.setMessage("Dosya indiriliyor. Lütfen bekleyin..."); pDialog.show(); client.get(indirilecekDosyaAdresi, new BinaryHttpResponseHandler() { @Override public void onSuccess(byte[] fileData) { try { OutputStream output = new FileOutputStream(dosyaKayitYeri); output.write(fileData); output.flush(); mesajGoster("Dosya SD karta kaydedildi!"); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } @Override public void onProgress(int bytesWritten, int totalSize) { super.onProgress(bytesWritten, totalSize); int progress = (bytesWritten * 100) / totalSize; pDialog.setProgress(progress); if (progress == 100) pDialog.dismiss(); } }); }
- Dosya gönderme/upload butonuna dokunulduğunda çalışacak olan aşağıdaki metodu MainActivity.java dosyanıza yerleştirin.
public void onClickDosyaGonder(View v) { File file = new File(dosyaKayitYeri); try { params.put("dosya", file); } catch (FileNotFoundException e) { e.printStackTrace(); } pDialog.setMessage("Dosya gönderiliyor. Lütfen bekleyin..."); pDialog.show(); client.post(uploadAdresi, params, new AsyncHttpResponseHandler() { @Override public void onSuccess(String response) { mesajGoster("Dosya sunucuya gönderildi!"); } @Override public void onProgress(int bytesWritten, int totalSize) { super.onProgress(bytesWritten, totalSize); int progress = (bytesWritten * 100) / totalSize; pDialog.setProgress(progress); if (progress == 100) pDialog.dismiss(); } }); }
- Harici karta yazmak ve İnternete ulaşabilmek için gerekli izinleri AndroidManifest.xml dosyasında tanımlayın.
<uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
- Dosyayı sunucuya gönderirken sunucu tarafında bizi bir php kodu karşılayacak. Bu kodu upload.php olarak sunucunuza kaydedin. PHP kodu gelen dosyayı upload.php dosyanın bulunduğu dizine kaydeder. upload.php dosyasının bulunduğu dizine chmod 777 vermeyi unutmayın. Aksi takdirde dosya bu dizine yazılamayacaktır.
<?php $dizin = ''; $yuklenecek_dosya = $dizin . basename($_FILES['dosya']['name']); echo '<pre>'; if (move_uploaded_file($_FILES['dosya']['tmp_name'], $yuklenecek_dosya)) { echo "Dosya geçerli ve başarıyla yüklendi.n"; } else { echo "Olası dosya yükleme saldırısı!n"; } echo 'Diğer hata ayıklama bilgileri:'; print_r($_FILES); print "</pre>"; ?>
Projenin çalışır halinden bir kaç ekran görüntüsü :
İyi çalışmalar.
Merhabalar, öncelikle bu ders için teşekkür ederim. normal fotoğraflar için kodu normal çalıştırdım ama, diğer dosyalara geldiğinde pdf vs çalışmadı. Bu konuda yardımcı olabilmeniz mümkün mü. Teşekkür ederim
Merhaba,
Uygulamanızı android studioda kopyala yapıştır ile yaparken bazı sorunlar yaşıyorum. Çalışır halini dosya halinde göndere bilmeniz mümkün müdür?