TUS File Upload Nedir ? Tus File Upload Kütüphanesinin Android Kullanımı




 Bugünkü konumuz Tus File Upload ,Tus File Upload nedir ilk olarak bundan bahsedelim.İnsanlar her geçen gün daha fazla fotoğraf ve video paylaşıyor. Ancak mobil ağlar kırılganlığını koruyor. Platform API'leri de genellikle karmaşıktır ve her proje kendi dosya yükleyicisini oluşturur.Bu durumları ortadan kaldırmak için pek çok developerı bir araya gelerek oluşturduğu üçüncü parti bir dosya yükleme kütüphanesidir. Bu kütüphaneye Google da çalışan pek çok developer destek olmuştur.TUS'un amacı güvenilmez dosya yüklemeleri sorununu kesin olarak çözmektir.TUS kütüphanesi herhangi bir dili herhangi bir platformu desteklemektedir.TUS kütüphanesi hakkında ve kullanıldıkları diller hakkında buradan daha fazla kaynağa ulaşabilirsiniz. TUS kütüphanesi toplamda 5 farklı dil ve ortamı desteklemektedir. Bunlar JavaScript ,Java Cilent ,Go ,IOS ve Android platformudur. Biz bu yazımızda Android bir sonraki yazımızda ise IOS platformu için bahsedeceğiz. Bu kütüphanenin mobil platformu için kullanılmadan önce yapılması gereken iki işlem bulunmaktadır. İlk olarak sunucu tarafına TUS'un entegre edilmesi bu işlemin ardından , servis tarafına entegre edilmesi gerekmektedir. Biz bu yazımız da ise Android platformu için gerekli olan kısımlarından bahsedeceğiz.

TUS File upload AsyncTask olarak çalışmaktadır.Bu sayede projenizdeki dosyalar sıralı şekilde yüklenebilmektedir. Android platformunda Retrofit'e göre pek çok avantajı bulunmaktadır.Bunları maddeler halinde açıklayalım.

  • İnternet kesilse dahi dosya yükleme işlemine internet geldiğinde otomatik olarak devam edebiliyor.
  • Server sunucuya kurulup Nginx üzerinden yönlendirilme yapılıyor.
  • Dosya yükleme işlemleri tek noktadan yapılıyor.Upload yapıldıktan sonra dosyanın eşleştirilmesi için servislerde düzenleme gerekmektedir.
  • Sunucu dosyaları istediğiniz boyutta chunk’lara bölünebiliyor.
  • Sunucu üzerindeki upload limitine takılmıyorsunuz.
Dosya yüklemek için pek çok farklı yöntem kullandım.Bu yöntemlerin arasında en çok beğendiğim ve en az sorun yaşadığım yöntem TUS File upload işlemi oldu.

build.gradle

  implementation 'io.tus.android.client:tus-android-client:0.1.9'
  implementation 'io.tus.java.client:tus-java-client:0.4.2'


AndroidManifest.xml


  <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />


TUS File Upload şu şekilde çalışmaktadır.Sunucuya yüklenen dosya işleminden sonra sunucu tarafı dosya ismini dönmektedir.Bu dosya ismini kullandığınız servise iletmeniz gerekmektedir.

UploadTask AsyncTask


   public static class UploadTask extends AsyncTask<Void, Long, URL> {
        private ITusUploadComplete contextUploader;
        private TusClient client;
        private TusUpload upload;
        private Exception exception;

        public UploadTask(ITusUploadComplete contextUploader, TusClient client, TusUpload upload) {
            this.contextUploader = contextUploader;
            this.client = client;
            this.upload = upload;
            listUploadedTusFileIDs = new ArrayList<>();
        }

        @Override
        protected void onPreExecute() {
            contextUploader.onPreUpload();
        }

        @Override
        protected void onPostExecute(URL uploadURL) {
            if (uploadURL != null){
                String[] paths = uploadURL.getPath().split("/");
                contextUploader.onUploadComplete(paths[paths.length - 1]);
            }
        }

        @Override
        protected void onCancelled() {
            if (exception == null) exception = new Exception("Upload Canceled " + upload.getMetadata().get("filename"));
            contextUploader.onCancelled(exception);
        }

        @Override
        protected void onProgressUpdate(Long... updates) {
//            long uploadedBytes = updates[0];
//            long totalBytes = updates[1];
//            ViewUtility.toastMessage(activity.getApplicationContext(),String.format("Yüklendi %d/%d.", uploadedBytes, totalBytes));
            contextUploader.onProgressUpdate(updates);
        }

        @Override
        protected URL doInBackground(Void... params) {
            try {
                TusUploader uploader = client.resumeOrCreateUpload(upload);
                long totalBytes = upload.getSize();
                long uploadedBytes = uploader.getOffset();
                uploader.setChunkSize(1024 * 1024);

                while (!isCancelled() && uploader.uploadChunk() > 0) {
                    uploadedBytes = uploader.getOffset();
                    publishProgress(uploadedBytes, totalBytes);
                }
                uploader.finish();
                return uploader.getUploadURL();

            } catch (Exception e) {
                exception = e;
                e.printStackTrace();
               cancel(true);
            }
            return null;
        }
    }


ITusUploadComplete.java Interface



  public interface ITusUploadComplete {

    void onPreUpload();
    void onUploadComplete(String uploadedFileID);
    void onCancelled(Exception e);
    void onProgressUpdate(Long... updates);
}


Tus işleminde iletilecek dosyalar Uri olarak iletilmektedir. Örneğin fotoğraf yükleme işleminde eğer fotoğrafınızı galeriden seçmiş iseniz direk uri olarak alabilirsiniz. Fotoğrafınızı kamera kullanarak çekmiş ise iseniz ilk olarak Uri'ye dönüştürmeniz gerekmektedir.

MainActivity.java


 public class MainActivity extends AppCompatActivity implements ITusUploadComplete {
      private TusClient tusClient;
     protected void onCreate(Bundle savedInstanceState) {
    	super.onCreate(savedInstanceState);
        setContentView(R.layout.main_activity);
            initializeTusUploader();

    }
    
     private void initializeTusUploader() {
        try {
            tusClient = new TusClient();
            String url = PreferencesUtil.getInstance(MainActivity.this).getString(PreferencesUtil.TUS, PreferencesUtil.TUS_DEFAULT_URL);
            tusClient.setUploadCreationURL(new URL(url));
            tusClient.enableResuming(new TusPreferencesURLStore(PreferencesUtil.getInstance(MainActivity.this).getPreferences()));
        } catch (MalformedURLException e) {
            ViewUtility.toastMessage(NewTaskActivity.this, e.getMessage());
        }
    }
    
    
      private List<Uri> listUploadFileUris ;

    private void setFileListAndUpload() {
        listUploadFileUris = new ArrayList<>();

        if (!mainModelSliderImages.isEmpty()) {
            for (MainModelSliderImage image1 : mainModelSliderImages) {
                System.out.println("UPLOAD EDILECEK RESIM DOSYASI " + image1.getUri());
                listUploadFileUris.add(image1.getUri());
            }
    beginUpload();
        }

    }

    private boolean hasTusError = false;
    private void beginUpload() {
        try {
            listUploadedFileIDs = new ArrayList<>();
            for (Uri uri : listUploadFileUris) {
                if (!hasTusError) {
                    TusUpload tusUpload = new TusAndroidUpload(uri, this);
                    uploadTask = new UploadTask(this, tusClient, tusUpload);
                    uploadTask.execute();
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private List<String> listUploadedFileIDs;
    @Override
    public void onUploadComplete(String uploadedFileID) {
        loading.setVisibility(View.GONE);
        if (!SourceUtility.isNullOrEmpty(uploadedFileID)) {
            listUploadedFileIDs.add(uploadedFileID);
            // Yüklenmek istenen dosya sayısı ile yüklenen dosya sayısı eşit ise upload işlemi bitmiş demektir.
            // gelen ID'ler servise gönderilir...
            if (listUploadedFileIDs.size() == listUploadFileUris.size()) {
          		List<String> fileIDList = new ArrayList<>();
                for (String fileID : listUploadedFileIDs) {
                   fileIDList.add(fileID);
                }
                sendRequest(fileReq);
            }
        }
    }

    @Override
    public void onPreUpload() {
        loading.setVisibility(View.VISIBLE);
    }

    @Override
    public void onCancelled(Exception e) {
        loading.setVisibility(View.GONE);
        if (e != null) {
            ViewUtility.toastMessage(this, e.getMessage());
            hasTusError = true; // Yüklemede hata oluşması durumunda yükleme durduruldu.
            e.printStackTrace();
        }
    }

    @Override
    public void onProgressUpdate(Long... updates) {
       Log.i("this", "Dosyalar yükleniyor...");
    }
    
    
}
		


TUS File upload işlemi bu şekilde daha fazla bu tarz yazılar gelmesini istiyorsanız yorum yazabilir ve istediğiniz konuları belirtebilirsiniz. Aklınıza takılan soruları yorum kısmında sorabilirsiniz. İyi kodlamalar.

Yorum Gönder

0 Yorumlar