Java dosya yükleme aracı sınıfı (ortak dosya yüklemesine göre)

Önsöz

  • Commons-fileupload'a dayalı olarak, testte kullanılan sürüm 1.3.1'dir ve commons-io.jar'ı tanıtmayı unutmayın (testte kullanılan sürüm 2.5'tir);
  • Springmvc projesinde kullanırsanız, kendi yükleme işlevini kapatmanız gerekir ve springboot projesinin de spring.servlet.multipart.enabled = false;
  • Not 1: Dosya depolama kök dizini (basePath) mevcut olmalıdır;
  • Not 2: Formda method, enctype ve method = "post" enctype = "multipart / form-data" olmalıdır
  • Örneğin: < method = "post" enctype = "multipart / form-data" dan >

Örnek 1 (parametrelerin en basit versiyonu)

// Yükleme aracı sınıfını başlat

UploadUtils uploadUtils = new UploadUtils (istek);

// Dosyanın saklandığı kök dizini ayarlayın

uploadUtils.setBasePath (ResourceUtils.getResource ("statik"). getFile (). getAbsolutePath () + File.separator + "fileupload");

// Sonucu yükle ve döndür

ResultData resultData = uploadUtils.upload ();

// Yükleme sonuçlarını yazdır

System.out.println (JSONObject.toJSONString (resultData))

Kullanım örneği iki (parametrenin tam sürümü)

// Yükleme aracı sınıfını başlat

UploadUtils uploadUtils = new UploadUtils (istek);

// Dosyanın saklandığı kök dizini ayarlayın

uploadUtils.setBasePath (ResourceUtils.getResource ("statik"). getFile (). getAbsolutePath () + File.separator + "fileupload");

// Dosyaları depolamak için özel bir dizin belirleyin (basePath kök dizini altında bulunur)

uploadUtils.setDirName ("aaa" + Dosya ayırıcı + "bbb");

// Dosya erişimi için kök yolunu belirleyin (örneğin: localhost: 8080 / xxx / fileupload, baseUrl dosya yükleme olabilir, ancak buna erişilip erişilemeyeceği belirli proje yapılandırmasına bağlıdır)

uploadUtils.setBaseUrl ("fileupload");

// Tek bir dosya için izin verilen maksimum değeri ayarlayın

uploadUtils.setFileSizeMax (1024 * 1024 * 1L);

// Tüm dosyalar için izin verilen maksimum değeri ayarlayın

uploadUtils.setSizeMax (1024 * 1024 * 10L);

// Yüklenmesine izin verilen dosya türlerini ayarlayın

uploadUtils.setExtNames ("jpg, png, gif");

// Tek bir dosya yüklendiğinde, dosya adının varsayılan olarak özelleştirilmesine izin verilir

//uploadUtils.setAllowRename(true);

//uploadUtils.setFileRename("Özel dosya adı ");

// Büyük dosyalar için geçici önbellek dosyasının yolunu özelleştirin (varsayılan sistem geçici dosya dizini)

// uploadUtils.setTempPath ("E: \ temp");

// Bu yüklemenin sonucunu yükleyin ve geri gönderin (bu yüklemenin genel başarı veya başarısızlık bilgileri)

ResultData resultData = uploadUtils.upload ();

// Genel yükleme sonucunu yazdırın

System.out.println (JSONObject.toJSONString (resultData));

// Yükleme başarılı olduğunda her dosyanın sonucunu yükle (giriş adı, orijinal dosya adı, en sonunda kaydedildiğinde dosya adı, dosya kaydetme yolu, erişim yolu)

System.out.println (JSONObject.toJSONString (uploadUtils.getUploadResults ()));

// Veya aşağıdakiler de yükleme sonucunu verebilir

System.out.println (JSONObject.toJSONString (resultData.getObj ()));

Döndürülen sonuç örnekleri

{

"msg": "Başarıyla yüklendi",

"obj" :,

"başarı": doğru

}

Dosya yükleme aracı kaynak kodu

paket org.soybean.utils.io;

java.io.File içe aktarma;

java.text.SimpleDateFormat'ı içe aktar;

import java.util.ArrayList;

java.util.Arrays içe aktarın;

import java.util.Date;

java.util.HashMap'i içe aktarın;

java.util.Iterator'ı içe aktarın;

import java.util.List;

java.util.Map içe aktarın;

java.util.Random içe aktarın;

import javax.servlet.http.HttpServletRequest;

org.apache.commons.fileupload.FileItem içe aktarımı;

org.apache.commons.fileupload.FileUploadBase dosyasını içe aktarın;

org.apache.commons.fileupload.disk.DiskFileItemFactory içe aktarımı;

org.apache.commons.fileupload.servlet.ServletFileUpload dosyasını içe aktarın;

org.apache.commons.fileupload.servlet.ServletRequestContext'i içe aktar;

import org.soybean.bean.ResultData;

import org.soybean.utils.StringUtils;

/ **

* Dosya yükleme araçları

* Açıklama 1: Ortak dosya yüklemesine göre, testte kullanılan sürüm 1.3.1'dir

* Açıklama 2: Springmvc projesinde kullanılıyorsa, kendi yükleme işlevini kapatmanız gerekir ve springboot projesinin de spring.servlet.multipart.enabled = false yapılandırması gerekir

* Not: Dosya depolama kök dizini (basePath) mevcut olmalıdır

*

* zkh

* 7 Kasım 201912:26

* /

public class UploadUtils {

// (Gerekli) Dosya depolama dizininin kök yolu (varsayılan proje kök yoludur)

private String basePath = System.getProperty ("user.dir");

// (İsteğe bağlı) Dosyanın dizin adı (kök yolu altında alt bölümlere ayrılmaya devam eden dizin)

private String dirName = "";

// (İsteğe bağlı) Dosya erişim kök adresi (örneğin, proje http: // localhost: 8080 / xxx / fileupload ise, baseUrl dosya yükleme olabilir)

private String baseUrl = "";

// (İsteğe bağlı) Tek bir dosyanın maksimum boyutu

özel Uzun fileSizeMax = 1024 * 1024 * 10L;

// (isteğe bağlı) tüm dosyaların maksimum boyutunun toplamı

özel Uzun sizeMax = 1024 * 1024 * 10L;

// (İsteğe bağlı) Dosya uzantılarının yüklenmesine izin verilir (virgülle ayrılmış ",")

özel String extNames;

// (İsteğe bağlı) Dosyaların yeniden adlandırılmasına izin verilip verilmeyeceği (varsayılan olarak izin verilir ve otomatik olarak birden çok dosyaya izin verilmeyecek şekilde ayarlanır)

private boolean allowRename = true;

// (İsteğe bağlı) Özel dosya adı (nihai dosya adı olması gerekmez, yeniden adlandırmaya izin verilip verilmediğine bağlıdır)

private String fileRename;

// (İsteğe bağlı) Geçici yolu yükleyin (varsayılan, sistemin geçici dizinidir)

private String tempPath = System.getProperty ("java.io.tmpdir");

/ ** Üst kısım özelleştirilebilir niteliktir ve alt kısım salt okunur get (set atanamaz) özniteliğidir ======================== =============================================== ====== * /

// Dosyanın son dosya adı

private String newFileName;

// Tüm dosyaların gerçek boyutu

private Long filesSize = 0L;

// Dosya dizin yolunu kaydet

private String savePath;

// (alan adı ve proje yolu olmadan) dosya erişim yolu (dosya adı hariç), ara değişkenler, nihai erişim URL'sini birleştirmek için kullanılır

private String saveUrl;

// (alan adı ve proje yolu olmadan) Nihai dosya erişiminin URL'si (dosya adı dahil)

private String fileUrl;

// İstekteki normal form alanları

özel Harita < Dize, Dize > alanlar = yeni HashMap < Dize, Dize > ();

// İstekteki dosya türü alanı

özel Liste < FileItem > fileList = new ArrayList < FileItem > ();

// Hata hatırlatma bilgilerini yükleyin

private String errorMsg;

// Her dosyanın sonucunu yükle

özel liste < Sonuç > uploadResults = new ArrayList < Sonuç > ();

özel HttpServletRequest isteği = boş;

public UploadUtils (HttpServletRequest isteği) {

this.request = istek;

}

/ **

* Dosya yükleme

* /

@SuppressWarnings ("kontrol edilmemiş")

public ResultData (), İstisna {

// Başlatma formu alanını doğrula

this.initCheckDir ();

if (StringUtils.isNotBlank (this.errorMsg)) {

ResultData.fail (this.errorMsg) döndür;

}

// Form alanı başlatma ve doğrulama

this.initFieldAndCheckFile ();

if (StringUtils.isNotBlank (this.errorMsg)) {

ResultData.fail (this.errorMsg) döndür;

}

// dosyaları yükle

eğer (! this.fileList.isEmpty ()) {

eğer (this.fileList.size () > 1) {

// Birden fazla dosya olduğunda yeniden adlandırmaya izin verilmez

this.allowRename = false;

}

// Yüklenen dosyayı kaydedin

for (FileItem öğesi: this.fileList) {

Sonuç sonucu = yeni Sonuç ();

result.setOldFileName (item.getName ());

result.setFieldName (item.getFieldName ());

this.saveFile (öğe); // (önemli) dosyayı kaydedin

result.setSavePath (this.savePath + this.newFileName);

result.setFileUrl (this.saveUrl + this.newFileName);

result.setNewFileName (this.newFileName);

uploadResults.add (sonuç);

}

} Başka {

ResultData.fail ("Dosya bulunamadı") döndür;

}

if (StringUtils.isBlank (this.errorMsg)) {

ResultData.success ("Yükleme başarılı", uploadResults) döndür;

} Başka {

ResultData.fail döndür ("Yükleme başarısız oldu", uploadResults);

}

}

/ **

* Yüklemeden önce dosya dizinini doğrulayın ve başlatın

* Açıklama: Doğrulama-1

* /

private void initCheckDir () istisna atar {

// Dosya dizin yolunu kaydet

this.savePath = this.basePath + "/";

// Dosya kaydetme dizini URL'si

this.saveUrl = this.baseUrl + "/";

// Dosya depolama klasörü dizini

Dosya uploadDir = yeni Dosya (this.savePath);

// İçerik türünü alın

Dize contentType = this.request.getContentType ();

if (contentType == null ||! contentType.startsWith ("multipart")) {

this.errorMsg = "İstek, çok parçalı / form veri akışı içermiyor";

} else if (! ServletFileUpload.isMultipartContent (this.request)) {

this.errorMsg = "Lütfen bir dosya seçin";

} else if (! uploadDir.isDirectory ()) {

this.errorMsg = "Yükleme dizini mevcut değil";

} else if (! uploadDir.canWrite ()) {

this.errorMsg = "Yükleme dizininin yazma izni yok";

} Başka {

// Bir basePath / dirName / klasörü oluşturun

this.savePath + = this.dirName + File.separator;

this.saveUrl + = this.dirName + "/";

Dosya saveDirFile = yeni Dosya (this.savePath);

eğer (! saveDirFile.exists ()) {

saveDirFile.mkdirs ();

}

// Geçici yükleme yolunu al

this.tempPath + = File.separator;

Dosya dosyası = yeni Dosya (this.tempPath);

eğer (! file.exists ()) {

file.mkdirs ();

}

// Tek tip yol ayırıcı

this.savePath = this.savePath.replace ("/", File.separator)

.replace ("//", Dosya ayırıcı)

.replace ("\", File.separator)

.replace ("\", File.separator);

this.saveUrl = this.saveUrl.replace ("\", "/").replace("//", "/");

}

}

/ **

* İstekteki form özelliği alanını başlatın, dosya alanını doğrulayın

* Açıklama: Doğrulama-2

* Açıklama: Formdaki genel öznitelik alanlarının ve dosya öznitelik alanlarının haritasını döndürür

* /

private void initFieldAndCheckFile (), Exception {

// İsteğin bir dosya yükleme isteği olup olmadığını belirleyin

eğer (ServletFileUpload.isMultipartContent (this.request)) {

DiskFileItemFactory fabrika = yeni DiskFileItemFactory ();

// Eşik, bu değeri aşarsa geçici dizine yazılır, aksi takdirde bellekte olur

factory.setSizeThreshold (1024 * 1024 * 10);

factory.setRepository (yeni Dosya (this.tempPath));

ServletFileUpload upload = new ServletFileUpload (fabrika);

upload.setHeaderEncoding ("UTF-8");

// Tek bir dosya için maksimum yükleme sınırı

eğer (this.fileSizeMax > 0L) {

upload.setFileSizeMax (this.fileSizeMax);

}

// Tüm dosyalar için maksimum yükleme sınırı

eğer (this.sizeMax > 0L) {

upload.setSizeMax (this.sizeMax);

}

Liste < FileItem > öğeler = boş;

Deneyin {

items = upload.parseRequest (new ServletRequestContext (this.request));

} catch (FileUploadBase.FileSizeLimitExceededException fileSizeLimit) {

errorMsg = "Yüklenen dosyadaki bir dosyanın boyutu, tek bir dosya için izin verilen maksimum değeri aşıyor (izin verilen maksimum değer:" + FileUtils.formatLength (fileSizeMax) + ")";

dönüş;

} catch (FileUploadBase.SizeLimitExceededException sizeLimit) {

errorMsg = "Yüklenen dosya boyutunun toplamı izin verilen maksimum değeri aşıyor (izin verilen maksimum:" + FileUtils.formatLength (sizeMax) + ")";

dönüş;

}

// İstekteki FileItem'i işle

eğer (öğeler! = boş! öğeler.isEmpty ()) {

Yineleyici < FileItem > iter = items.iterator ();

while (iter.hasNext ()) {

Dosya Öğesi öğesi = iter.next ();

eğer (item.isFormField ()) {

// Normal form alanı

this.fields.put (item.getFieldName (), item.getString ());

} Başka {

String fileName = item.getName ();

String fileExt = dosyaAdı.substring (dosyaAdı.lastIndexOf (".") + 1) .toLowerCase ();

// Dosya türü alanı

this.filesSize + = item.getSize ();

eğer (this.extNames! = null! Diziler. < Dize > asList (this.extNames.split (",")). contains (fileExt)) {// Uzantıyı kontrol edin

this.errorMsg + = "Yüklenen dosyanın uzantısına izin verilmiyor. \ nYalnızca izin verilir" + this.extNames + "format";

} Başka {

this.fileList.add (öğe);

}

}

}

}

}

}

/ **

* belgeyi kaydet

* /

private void saveFile (FileItem öğesi) Exception {

String oldFileName = item.getName ();

String fileExt = eskiDosyaAdı.substring (eskiDosyaAdı.lastIndexOf (".") + 1) .toLowerCase ();

// Yeniden adlandırmaya izin ver

eğer (this.allowRename) {

// Yeniden adlandırma alanı boşsa veya yeniden adlandırılmış dosya zaten mevcutsa, otomatik olarak yeni bir dosya adı oluşturulur

if (StringUtils.isBlank (this.fileRename) || new File (this.savePath, this.fileRename + fileExt) .exists ()) {

SimpleDateFormat df = new SimpleDateFormat ("yyyyMMddHHmmssSSS");

this.newFileName = df.format (new Date ()) + "_" + (new Random (). nextInt (899) + 100) + "." + fileExt;

} Başka {

this.newFileName = this.fileRename + "." + fileExt;

}

} Başka {

// Orijinal dosya adı zaten mevcutsa, otomatik olarak yeni bir dosya adı oluşturulur

eğer (yeni Dosya (this.savePath, oldFileName) .exists ()) {

SimpleDateFormat df = new SimpleDateFormat ("yyyyMMddHHmmssSSS");

this.newFileName = df.format (new Date ()) + "_" + (new Random (). nextInt (899) + 100) + "." + fileExt;

} Başka {

this.newFileName = oldFileName;

}

}

Dosya uploadedFile = yeni Dosya (this.savePath, this.newFileName);

// dosya yaz

item.write (uploadedFile);

}

public Long getFileSizeMax () {return fileSizeMax;}

public void setFileSizeMax (Long fileSizeMax) {this.fileSizeMax = fileSizeMax;}

public Uzun getSizeMax () {return sizeMax;}

public void setSizeMax (Long sizeMax) {this.sizeMax = sizeMax;}

public String getExtNames () {dönüş extNames;}

public void setExtNames (String extNames) {this.extNames = extNames;}

public String getBasePath () {dönüş temelYol;}

public void setBasePath (String basePath) {this.basePath = basePath;}

public String getDirName () {return dirName;}

public void setDirName (String dirName) {this.dirName = dirName;}

public String getBaseUrl () {dönüş baseUrl;}

public void setBaseUrl (String baseUrl) {this.baseUrl = baseUrl;}

public String getTempPath () {dönüş tempPath;}

public void setTempPath (String tempPath) {this.tempPath = tempPath;}

genel boole isAllowRename () {return allowRename;}

public void setAllowRename (boolean allowRename) {this.allowRename = allowRename;}

public String getFileRename () {return fileRename;}

public void setFileRename (String fileRename) {this.fileRename = fileRename;}

public String getNewFileName () {return newFileName;}

public Long getFilesSize () {return filesSize;}

public String getSavePath () {return savePath;}

public String getSaveUrl () {return saveUrl;}

public String getFileUrl () {return fileUrl;}

genel Harita < Dize, Dize > getFields () {dönüş alanları;}

genel Liste < FileItem > getFileList () {return fileList;}

public String getErrorMsg () {return errorMsg;}

genel Liste < Sonuç > getUploadResults () {return uploadResults;}

public void setUploadResults (Liste < Sonuç > uploadResults) {this.uploadResults = uploadResults;}

/ **

* Her dosyanın sonucunu yükle

* /

public static class Result {

// Dosya kaydetme yolu (dosya adı dahil)

private String savePath;

// Dosya erişim yolu (dosya adı dahil)

private String fileUrl;

// Dosya yüklendiğinde orijinal dosya adı

özel String oldFileName;

// Dosya nihayet kaydedildiğinde dosya adı

private String newFileName;

// Form metin kutusunun (giriş) ad özelliği

özel String fieldName;

public String getSavePath () {return savePath;}

public void setSavePath (String savePath) {this.savePath = savePath;}

public String getFileUrl () {return fileUrl;}

public void setFileUrl (String fileUrl) {this.fileUrl = fileUrl;}

public String getNewFileName () {return newFileName;}

public void setNewFileName (String newFileName) {this.newFileName = newFileName;}

public String getOldFileName () {eskiFileName döndür;}

public void setOldFileName (String oldFileName) {this.oldFileName = oldFileName;}

public String getFieldName () {return fieldName;}

public void setFieldName (String fieldName) {this.fieldName = fieldName;}

}

}

Son olarak, tam bir basit (veya kaba) örnek

Önce bu iki kavanozun olduğundan emin olun

Form

Kontrolör

@RequestMapping ("yükleme")

@Kafadergisi

public ResultData yüklemesi (HttpServletRequest isteği) Exception {atar

// Yükleme aracı sınıfını başlat

UploadUtils uploadUtils = new UploadUtils (istek);

// Dosyanın saklandığı kök dizini ayarlayın

uploadUtils.setBasePath (ResourceUtils.getResource ("statik"). getFile (). getAbsolutePath () + File.separator + "fileupload");

// Sonucu yükle ve döndür

ResultData resultData = uploadUtils.upload ();

// Yükleme sonuçlarını yazdır

System.out.println (JSONObject.toJSONString (resultData));

sonuçVeri döndür;

}

Formu yüklemek ve aşağıdaki sonuçları döndürmek için tıklayın. Elbette, gerçekten kullandığınızda, döndürülen sonucu alabilmeniz için ajax'ı eşzamansız olarak göndermek için kullanmak daha iyidir

Unutun, biçimlendirin ve okuyun

Bilinmeyen hatalar olabilir ama kaynak kodu size verilmiş ve toplamda çok fazla kod yok, bence sizin için zor olmasa gerek.

Transfer: https://blog.csdn.net/qq_26486347/article/details/103046779

"Gece okumak" Uykunuzu iyileştirdiğinizde, hayatınızın her yönünü iyileştiriyorsunuz
önceki
Marksizmin temel teorilerini öğrenmek, Komünistler için zorunlu bir derstir
Sonraki
Ters akış oranı% 85 kadar yüksek Zaman makinesi gerçekten var mı? Bilim adamı: Alarm zili çaldı
Zhou Chunya'ya gücünüz yetmiyorsa, yine de Qingyibo Wenchuang'a gidebilirsiniz Bu ay sanat için "ellerinizi" kestiniz mi?
Audi Anlarda Infiniti'nin reklamını yaptı ve Tencent özür diledi
Hayat İpuçları | Saçınızı yıkamak için doğru zaman, her zaman yanlış saçları yıkadığım ortaya çıkıyor ...
Bağlantı noktası numarası aktarımı için en kapsamlı kılavuz! Kalifiye olup olmadığınıza bağlı olarak numarayı değiştirmeden operatörleri değiştirebilirsiniz.
nadir! Merkez Komitesi Siyasi Büro Daimi Komitesi bir toplantı yaptı ve olay yerinde bir uyarı videosu oynadı.
Yerli litografi makinesi "ikilem": 90nm işleminde sıkışmış, Çinli şirketler büyük ölçüde ASML'ye güveniyor
Geleneksel tedarik zincirinin finansal sıkıntılı noktalarını çözmek için, CITIC Bank'ın mektup-e zinciri "uzlaştırma + finansman" için hızlı bir yol açar
Du Yuesheng Zhang Xueliangın tek buluşması, ancak ömür boyu en iyi arkadaş oldu. Du Yueshengin yöntemleri gerçekten akıllı
Ağır! Şangay'ın on milyarlarca patronu teslim olduktan sonra, onun adı altındaki şirket de acı çekti: genel müdür cezai tedbirler aldı ve listeyi sonlandırmayı planladı
Başka bir Çinli teknoloji devi "düşüyor" ve çalışanlarına 56 milyon maaş borçlu ve sonunda iflas ediyor
95'ler sonrası için isim düzeltme! Katılmıyorsanız istifa mı edeceksiniz? Büyük verinin ortaya koyduğu gerçek aslında ...
To Top