Bağımlılık Olmadan Basit Java Dosya Yükleyici

Yayınlanan: 2023-01-06

Çağdaş web uygulamalarının ve web sitelerinin temel gereksinimlerinden biri, belge, fotoğraf ve video gibi dosyaların karşıya yüklenebilmesidir. Örneğin, kullanıcılar Instagram gibi sosyal ağ platformlarında video ve görseller yayınlayabilirler.

Dosya yükleme prosedürünü uygulamak ve yönetmek daha önce zor bir işti. Neyse ki, çevrimiçi teknolojideki gelişmelerin bir sonucu olarak dosya yüklemeleri daha basit hale geldi. Örneğin, bir Java dosya yükleyici , dosya yüklemeyi hızlı ve kolay hale getirir.

Ancak, dosya yüklemeleri yoluyla siber suçlular makinenize kötü amaçlı yazılım veya diğer zararlı içerikler yerleştirebilir ve sunucuyu bozabilir. Bu nedenle geliştiriciler, web sitelerine veya web uygulamalarına dosya yüklemenin güvenli olduğundan kesinlikle emin olmalıdır. Güvenli dosya yüklemesi sağlamak için güvenilir bir Java dosya yükleme SDK'sı kullanmanızı öneririz.

Bu makalede bir dosya yükleyici oluşturmak için Java'nın nasıl kullanılacağını ele alacağız.

Java Kullanarak Dosya Yükleyici Nasıl Uygulanır?

Bir dosya yükleyici, kullanıcıların bir dosyayı bir web uygulamasına veya web sitesine yüklemek için tıklayabilecekleri bir "gönder"den başka bir şey değildir. Bununla birlikte, bir dosya yükleyici, geliştiriciler için çok daha fazlasını ifade eder.

Yalnızca bir HTML formu ve bir servlet kullandığımız basit bir dosya yükleyici oluşturabiliriz. Örneğimizde, HTML formunun iki giriş alanı olacaktır. Bir giriş alanı, kullanıcının dosyasını yüklemesine izin verir ve ikinci giriş alanı, geliştiricinin bize dosyayı nerede saklamamız gerektiğini söylemesine izin verir.

Dosyayı içeren form verilerini sunucuya göndermek için POST yöntemini dava ediyoruz. Ayrıca, dosya yüklemeleri yaparken encrypt=”multipart/form-data” kullanırız çünkü dosyalar çok sayıda yazdırılamayan karakter içerir.

Sunucu uygulaması, POST isteğini yönetir ve gelen dosya verilerini işledikten sonra Dosyayı akıştan çıkarır. Hedef, sistemde Dosyanın kaydedilmesi gereken konumu belirtir. Yükle düğmesine bastığımızda, veriler servlet'e iletilir ve ardından Dosyayı belirlenen konumda depolar.

Giriş alanıyla bir HTML dosyası oluşturma

Başlamadan önce, takip etmek için bir index.html dosyası oluşturun.

index.html aşağıdaki koda sahip olmalıdır :

<!DOCTYPE html>
<html lang=”tr”>
<kafa>
<title>Java Dosya Yükleyici</title>
<meta http-equiv=”Content-Type” content=”text/html; karakter kümesi=UTF-8″>
</head>
<vücut>
<form method=”POST” action=”upload” enctype=”multipart/form-data” >
Dosya:
<input type=”file” name=”java-file” id=”java-file” /> <br/>
Hedef:
<input type=”text” value=”/java-folder” name=”hedef”/>
</br>
<input type=”gönder” value=”Gönder” name=”gönder” id=”gönder” />
</form>
</body>
</html>

İşte sayfanızın nasıl olması gerektiği:

Dosyanın sunucu tarafında işlenmesi

Servlet kodunu yazmak için FileUploadServlet.java adlı bir dosya oluşturacağız. Serletler, bileşenleri ve meta verileri tanımlamak için ek açıklamaları kullanır. Bu nedenle @WebServlet ek açıklaması, Java'da bir servlet bileşenini tanımlamak için kullanılır.

Servlet ek açıklaması, hangi HttpServlet'in hangi URL için yürütülmesi gerektiğini söylemelidir. Bunun için @WebServlet notumuzda name ve ulrPattern parametrelerini tanımlıyoruz. Formumuzu gönderdiğimizde, FileUploadServlet Sınıfının çalıştırılacağı /upload url'sine yönlendireceğimizi unutmayın.

@MultipartConfig ek açıklaması, sunucu uygulamasına MIME türünde multipart/form-data alacağını bildirir.

Şimdi tam kodumuzu yazalım.

@WebServlet(ad = "FileUploadServlet" , urlPatterns = { "/upload" })
@MultipartConfig
genel sınıf FileUploadServlet , HttpServlet'i genişletir {

özel son statik Logger LOGGER =
Logger.getLogger(FileUploadServlet.class.getCanonicalName());

korumalı geçersiz processRequest(HttpServletRequest isteği,
HttpServletResponse yanıtı)
ServletException, IOException { atar
yanıt.setContentType( “text/html;charset=UTF-8” );

final String dest= request.getParameter( “hedef” );
son Bölüm kısmı = request.getPart( “dosya” );
son Dize nameOfFile = getFileName(part);

Çıkış Akışı çıkışı = boş ;
Girdi Akışı devamı = boş ;
final PrintWriter printWriter = yanıt.getWriter();

dene {
çıkış = yeni FileOutputStream( yeni Dosya(hedef + Dosya.separator)
+ dosyanın adı));
devam = part.getInputStream();

int okuyucu = 0 ;
son bayt[] bayt = yeni bayt[ 1024 ];

while ((reader = cont.read(bytes)) != -1 ) {
out.write(bayt, 0 , okuyucu);
}
printWriter.println( "Dosya" + dosyanın adı + ", " + hedefte oluşturulur );
LOGGER.log(Level.INFO, "Dosya{0}, {1}'e yüklendi" ,
yeni Nesne[]{FileAdı, hedef});
} catch (FileNotFoundException fne) {
printWriter.println( "Bir dosya adından bahsetmediniz veya "
+ “var olmayan bir dosyaya dosya yüklemeye çalışmak”
+ "konum." );
printWriter.println( “<br/> HATA: “ + fne.getMessage());

LOGGER.log(Level.SEVERE, "Dosya yüklenirken hata oluştu. Hata: {0}" ,
yeni Nesne[]{fne.getMessage()});
} sonunda {
eğer (çıkış != null ) {
out.close();
}
eğer (devamı != boş ) {
devam.kapat();
}
eğer (printWriter != null ) {
printWriter.close();
}
}
}

private String getFileName(son Bölüm kısmı) {
final String partHeader = part.getHeader( “content-disposition” );
LOGGER.log(Seviye.BİLGİ, "Bölüm Başlığı = {0}" , parçaBaşlığı);
for (Dize içeriği : part.getHeader( “content-disposition” ) ).split( “;” )) {
if (content.trim().startsWith( “dosyaadı” )) {
içerik.alt dizeyi döndür (
content.indexOf( '=' ) + 1 ).trim().replace( “\”” , “” );
}
}
boş dönüş ;
}
}

processRequest yöntemi, istekten hedef ve dosya bölümünü aldıktan sonra dosya bölümünden dosya adını almak için getFileName yöntemini çağırır . Bunu takiben, yöntem bir FileOutputStream oluşturur ve dosyayı istenen konuma aktarır. Yöntemin hata işleme bölümü, dosya bulunamadı hatalarının en sık nedenlerinden birkaçını algılar ve ele alır.

kodu dağıt

Şimdi programımızı derleyip çalıştırmamız gerekiyor. Bunun için NetBeans, Eclipse, Intellij Idea gibi tercih ettiğiniz IDE'lerden herhangi birini kullanabilirsiniz.

https://cdn.pixabay.com/photo/2016/11/30/20/58/programming-1873854__340.png

NetBeans kullanıyorsanız, Netbeans IDE'yi açın ve çalışma dizinine gidin. Sorun yaşarsanız Java'nın resmi belgelerine bakın. Projeler sekmesinde klasörünüze sağ tıklayın ve Dağıt'ı seçin. Ardından, tarayıcıya erişebilir ve aşağıdaki URL'yi yazabiliriz:

http://localhost:8080/{klasöradı}/

URL'yi girip enter tuşuna bastıktan sonra yukarıda oluşturulan HTML sayfası açılacaktır. Bir dosyayı istenilen yere yüklemek için sistemde arama yapıp dosyayı seçebiliriz. Hedef alana Dosyayı saklamak istediğimiz klasörün yolunu yazıyoruz. Dizin yazılabilir olmalı ve sistemde zaten mevcut olmalıdır. Hedef alanı boşken yükle düğmesine tıkladığımızda bir istisna ortaya çıkıyor.

Yükle düğmesine tıkladığımızda sunucu uygulaması bir POST isteği alır ve seçilen dosyayı belirtilen klasöre kopyalar.

Belirlenen klasörü ziyaret edebilir ve yükle düğmesine tıkladıktan sonra yüklenen Dosyanın (örneğin TextFile.txt) orada olup olmadığını kontrol edebiliriz.

Şimdiye kadar HTML ve Java kullanarak basit bir Java dosya yükleyici oluşturduk. Bununla birlikte, "basit" birçok özelliği olan karmaşık bir yükleyici haline geldiğinden, önemli özellikleri olmayanlardan takip etmek zor olabilir. Sıfırdan bir yükleyici oluşturmayı düşündüğümüzde birçok güvenlik sorununun ortaya çıkmasından bahsetmiyorum bile. Bu nedenle, bir sonraki bölüm, dosyaları güvenli Filestack SDK ile nasıl yükleyebileceğinizi gösterecektir.

Filestack SDK ile dosyaları kolayca yükleme

Devam etmek için bir Filestack API anahtarına ihtiyacınız olacak .

Başlamak için aşağıdaki komutu kullanarak Filestack SDK'yı kurun:

uygulama 'com.filestack:filestack-java:0.9.0'

Filestack kullanarak yükleme özelliklerini uygulamak için Java dosyanızda aşağıdaki kodu kullanın:

// İstemci oluşturuluyor
Yapılandırma yapılandırması = yeni Yapılandırma ( "API_KEY" );
İstemci istemcisi = yeni İstemci(yapılandırma);

// Ayar seçenekleri ve karşıya yüklemeyle ilgili meta veriler
StorageOptions seçeneği = yeni StorageOptions.Builder()
.mimeType( “metin/düz” )
.filename( “dosya.txt” )
.yapı();

// Eşzamanlı yükleme gerçekleştir
FileLink dosyaları = client.upload( “/filepath” , false );

// eşzamansız yükleme gerçekleştir
Flowable<İlerleme<FileLink>> yükleme = client.uploadAsync( “filepath” , false );
upload.doOnNext( yeni Tüketici<İlerleme<FileLink>>() {
@geçersiz kıl
genel geçersiz kabul (İlerleme <FileLink> ilerleme) İstisna { atar
System.out.printf( “%f%% Dosyanız yüklendi\n” , progress.getPercent());
if (progress.getData() != null ) {
FileLink dosyaları = progress.getData();
}
}
});

Çalıştığından emin olmak için aşağıdaki testler yapılabilir:

./dosya testi

Uygulamanızı dağıtmak istiyorsanız, dağıtımların hedefi Bintray'dir. Dağıtmak için, Filestack organizasyonuna kayıtlı bir kullanıcı hesabına ihtiyacınız var. Temel Filestack sürüm yönergelerine de uyun. "BINTRAY USER" ve "BINTRAY API KEY" ortam değişkenleri gereklidir. Koşmak:

dışa aktar BINTRAY_USER=
BINTRAY_API_KEY= dışa aktar
./files bintrayYükleme

Çözüm

Kendi Java dosya yükleme sisteminizi sürdürmek ve oluşturmakta zorlanıyorsanız, üçüncü taraf bir aracı da tercih edebilirsiniz. Veri güvenliği ve mahremiyet endişeleri nedeniyle, örneğin tıbbi kayıtların bulunduğu dosyaları yüklerken, kişiler üçüncü taraf sistemlerini kullanmaktan kaçınabilir.

Ek olarak, dosya depolama altyapısına kimin erişebileceği konusunda çok az kontrole sahip olacaklarından endişe ediyorlar. Ancak, güvenilir bir dosya yükleme çözümü kullanarak form ve belge verilerinin güvenliğini garanti edebilirsiniz.

Sıkça Sorulan Sorular (SSS)

Bir API kullanarak dosyaları taşıyabilir misiniz?

Evet. Dosyaları bir API kullanarak taşımak, piyasada bulunan API tabanlı araçlar kullanılarak yapılabilir. Bu, çevrimiçi programlar gibi çeşitli platformlarda çalışan programlarla da birleştirilebilir.

Büyük bir dosyayı REST API'ye gönderebilir miyim?

Özellikle zayıf bant genişliği ve ağ bağlantıları gibi diğer faktörler mevcut olduğunda büyük dosyaları karşıya yüklemek zor olabilir. Çok sayıda yükleme hatasına neden olabilir.

Java yüklenen bir dosyayı nasıl okur?

Girdi akışlarını kullanarak, bir Java programı bayt veya karakter koleksiyonlarını okur. Dosya okuma, dosya nesnesinin oluşturulmasıyla başlayan, onu girdi dosyasına ileten, akıştaki verileri okuyan, işleyen ve ardından akışı ve dosya nesnesini kapatan sıralı bir işlemdir.

Dosya yükleme aracı nedir?

Web uygulamanıza bağlanabilen ve kullanıcıların fotoğraf, video ve metin dosyaları yüklemesine ve ayrıca bazı temel değişikliklere, filtre efektlerine vb. izin vermesine izin veren bir API veya eklentidir.