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.

progress_bar

Web Sunucu ile nasıl haberleşeceğiz?

Android’ten Web Server ile İletişime Geçelim! yazımızdan da hatırlayacağınız gibi HTTP Server ile iletişime geçmek için DefaultHttpClient kullanılmıştı. Bu yazımızda Instagram, Pinterest gibi  mobil uygulamalarda da kullanılan “Android Asynchronous Http Client” kütüphanesini kullanacağız.

Kütüphaneyi sayfasından Download butonuna tıklayarak indirip, Android projenizde libs dizinine aşağıdaki gibi yerleştirin.

http_1_libs

Projemizi oluşturmaya başlayalım.

  1. Yeni bir proje oluşturun File ⇒ New ⇒ Android Project
  2. İndirdiğiniz android-async-http-*.jar dosyasını libs altına kopyalayın.
  3. 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>
  4.  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;
    	}
    }
  5. 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();
    			}
    		});
    	}
  6. 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();
    			}
    		});
    	}

     

  7. 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"/>
  8. 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.

Şunlar da ilginizi çekebilir

2 yorum

  • mustafa
    11 Temmuz 2015 at 05:35

    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

  • Murat
    31 Temmuz 2015 at 11:18

    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?

LEAVE A COMMENT