Bu bölümün içeriği, Nginx ve FTP aracılığıyla bir resim sunucusu oluşturur. Bu bölümün içeriğini incelemeden önce, lütfen Linux sisteminize Nginx ve Vsftpd'nin kurulu olduğundan emin olun.
Nginx kurulumu
Vsftpd kurulumu
Efekt resmi:
Proje yapısı:
İlk olarak, çekirdek teknolojiyi kırmalıyız. Birim testi yoluyla görüntü yükleme işlevini gerçekleştirin.
paket com.itdragon.test; java.io.File içe aktarma; java.io.FileInputStream'i içe aktarın; org.apache.commons.net.ftp.FTP içe aktarımı; org.apache.commons.net.ftp.FTPClient içe aktarımı; org.junit.Test'i içe aktar; public class PictureFTPTest { // ftp yükleme resim işlevini test edin @Ölçek public void testFtpClient (), Exception { // 1. Bir FtpClient nesnesi oluşturun FTPClient ftpClient = yeni FTPClient (); // 2. ftp bağlantısı oluştur ftpClient.connect ("192.168.0.11", 21); // 3. ftp sunucusunda oturum açın ftpClient.login ("ftpuser", "kök"); // 4. Yerel dosyayı okuyun FileInputStream inputStream = new FileInputStream (yeni Dosya ("F: \ merhaba.png")); // 5. Yükleme yolunu ayarlayın ftpClient.changeWorkingDirectory ("/ usr / local / nginx / html / images"); // 6. Yüklenen dosyanın formatını ikili olarak değiştirin ftpClient.setFileType (FTP.BINARY_FILE_TYPE); // 7. Sunucu dosyaları depolar, ilk parametre sunucuda depolanan dosya adı ve ikinci parametre dosya akışıdır ftpClient.storeFile ("merhaba.jpg", inputStream); // 8. Bağlantıyı kapatın ftpClient.logout (); } }Not: ip adresi, bağlantı noktası, ftp kullanıcı adı, şifre, yerel dosya yolu ve Nginx sunucusu görüntü yolu vb., Bu dize parametreleri gerçek ayarlarınıza göre doldurulmalıdır. Nginx ve Vsftpd kurulumunuz verdiğim bağlantıya göre yapılırsa. O zaman sadece ip adresini değiştirmeniz gerekir.
Bir Maven Web projesi kurun, daha önce yazmıştım. Burada çok fazla açıklama yok.
Proje çekirdek yapılandırma dosyası
İlki, Maven'in pom.xml çekirdek dosyasıdır.
< proje xmlns = " xmlns: xsi = " xsi: schemaLocation = " > < modelVersion > 4.0.0 < / modelVersion > < Grup kimliği > com.itdragon.upload < /Grup kimliği > < artifactId > pictrue-hizmeti < / artifactId > < versiyon > 0.0.1-SNAPSHOT < / version > < ambalaj > savaş < / paketleme > < ! - Bağımlılık sürüm numaralarını merkezi olarak tanımlayın - > < özellikleri > < junit.version > 4.12 < /junit.version > < spring.version > 4.1.3. YAYIN < /spring.version > < mybatis.version > 3.2.8 < /mybatis.version > < mybatis.spring.version > 1.2.2 < /mybatis.spring.version > < mybatis.paginator.version > 1.2.15 < /mybatis.paginator.version > < mysql.version > 5.1.6 < /mysql.version > < slf4j.version > 1.6.4 < /slf4j.version > < jackson.version > 2.4.2 < /jackson.version > < druid.version > 1.0.9 < /druid.version > < httpclient.version > 4.3.5 < /httpclient.version > < jstl.version > 1.2 < /jstl.version > < servlet-api.version > 2.5 < /servlet-api.version > < jsp-api.version > 2.0 < /jsp-api.version > < joda-time.version > 2.5 < /joda-time.version > < commons-lang3.version > 3.3.2 < /commons-lang3.version > < commons-io.version > 1.3.2 < /commons-io.version > < commons-net.version > 3.3 < /commons-net.version > < pagehelper.version > 3.4.2 < /pagehelper.version > < jsqlparser.version > 0.9.1 < /jsqlparser.version > < commons-fileupload.version > 1.3.1 < /commons-fileupload.version > < jedis.version > 2.7.2 < /jedis.version > < solrj.version > 4.10.3 < /solrj.version > < /özellikleri > < bağımlılıklar > < ! - Zaman işlemi bileşeni - > < bağımlılık > < Grup kimliği > joda zamanı < /Grup kimliği > < artifactId > joda zamanı < / artifactId > < versiyon > $ {joda-time.version} < / version > < /bağımlılık > < ! - Apache aracı bileşenleri - > < bağımlılık > < Grup kimliği > org.apache.commons < /Grup kimliği > < artifactId > commons-lang3 < / artifactId > < versiyon > $ {commons-lang3.version} < / version > < /bağımlılık > < bağımlılık > < Grup kimliği > org.apache.commons < /Grup kimliği > < artifactId > ortak < / artifactId > < versiyon > $ {commons-io.version} < / version > < /bağımlılık > < bağımlılık > < Grup kimliği > ortak ağ < /Grup kimliği > < artifactId > ortak ağ < / artifactId > < versiyon > $ {commons-net.version} < / version > < /bağımlılık > < ! - Jackson Json İşleme Araç Seti - > < bağımlılık > < Grup kimliği > com.fasterxml.jackson.core < /Grup kimliği > < artifactId > jackson-databind < / artifactId > < versiyon > $ {jackson.version} < / version > < /bağımlılık > < ! - httpclient - > < bağımlılık > < Grup kimliği > org.apache.httpcomponents < /Grup kimliği > < artifactId > httpclient < / artifactId > < versiyon > $ {httpclient.version} < / version > < /bağımlılık > < !-- ünite testi -- > < bağımlılık > < Grup kimliği > Junit < /Grup kimliği > < artifactId > Junit < / artifactId > < versiyon > $ {junit.version} < / version > < dürbün > Ölçek < /dürbün > < /bağımlılık > < ! - Günlük işleme - > < bağımlılık > < Grup kimliği > org.slf4j < /Grup kimliği > < artifactId > slf4j-log4j12 < / artifactId > < versiyon > $ {slf4j.version} < / version > < /bağımlılık > < ! - Mybatis - > < bağımlılık > < Grup kimliği > org.mybatis < /Grup kimliği > < artifactId > mybatis < / artifactId > < versiyon > $ {mybatis.version} < / version > < /bağımlılık > < bağımlılık > < Grup kimliği > org.mybatis < /Grup kimliği > < artifactId > mybatis-bahar < / artifactId > < versiyon > $ {mybatis.spring.version} < / version > < /bağımlılık > < bağımlılık > < Grup kimliği > com.github.miemiedev < /Grup kimliği > < artifactId > mybatis-paginator < / artifactId > < versiyon > $ {mybatis.paginator.version} < / version > < /bağımlılık > < bağımlılık > < Grup kimliği > com.github.pagehelper < /Grup kimliği > < artifactId > pagehelper < / artifactId > < versiyon > $ {pagehelper.version} < / version > < /bağımlılık > < ! - MySql - > < bağımlılık > < Grup kimliği > mysql < /Grup kimliği > < artifactId > mysql-bağlayıcı-java < / artifactId > < versiyon > $ {mysql.version} < / version > < /bağımlılık > < ! - bağlantı havuzu - > < bağımlılık > < Grup kimliği > com.alibaba < /Grup kimliği > < artifactId > Druid < / artifactId > < versiyon > $ {druid.version} < / version > < /bağımlılık > < ! - İlkbahar - > < bağımlılık > < Grup kimliği > org.springframework < /Grup kimliği > < artifactId > bahar bağlamı < / artifactId > < versiyon > $ {spring.version} < / version > < /bağımlılık > < bağımlılık > < Grup kimliği > org.springframework < /Grup kimliği > < artifactId > taze fasulye < / artifactId > < versiyon > $ {spring.version} < / version > < /bağımlılık > < bağımlılık > < Grup kimliği > org.springframework < /Grup kimliği > < artifactId > Spring-webmvc < / artifactId > < versiyon > $ {spring.version} < / version > < /bağımlılık > < bağımlılık > < Grup kimliği > org.springframework < /Grup kimliği > < artifactId > bahar-jdbc < / artifactId > < versiyon > $ {spring.version} < / version > < /bağımlılık > < bağımlılık > < Grup kimliği > org.springframework < /Grup kimliği > < artifactId > bahar yönleri < / artifactId > < versiyon > $ {spring.version} < / version > < /bağımlılık > < ! - JSP ile ilgili - > < bağımlılık > < Grup kimliği > jstl < /Grup kimliği > < artifactId > jstl < / artifactId > < versiyon > $ {jstl.version} < / version > < /bağımlılık > < bağımlılık > < Grup kimliği > javax.servlet < /Grup kimliği > < artifactId > servlet-api < / artifactId > < versiyon > $ {servlet-api.version} < / version > < dürbün > sağlanan < /dürbün > < /bağımlılık > < bağımlılık > < Grup kimliği > javax.servlet < /Grup kimliği > < artifactId > jsp-api < / artifactId > < versiyon > $ {jsp-api.version} < / version > < dürbün > sağlanan < /dürbün > < /bağımlılık > < ! - Dosya yükleme bileşeni - > < bağımlılık > < Grup kimliği > ortak dosya yükleme < /Grup kimliği > < artifactId > ortak dosya yükleme < / artifactId > < versiyon > $ {commons-fileupload.version} < / version > < /bağımlılık > < ! - Redis istemcisi - > < bağımlılık > < Grup kimliği > redis.clients < /Grup kimliği > < artifactId > Jedis < / artifactId > < versiyon > $ {jedis.version} < / version > < /bağımlılık > < ! - solr istemcisi - > < bağımlılık > < Grup kimliği > org.apache.solr < /Grup kimliği > < artifactId > solr-solrj < / artifactId > < versiyon > $ {solrj.version} < / version > < /bağımlılık > < / bağımlılıklar > < inşa etmek > < finalName > $ {project.artifactId} < / finalName > < eklentiler > < ! - Kaynak dosyası kopyalama eklentisi - > < Eklenti > < Grup kimliği > org.apache.maven.plugins < /Grup kimliği > < artifactId > maven-kaynaklar-eklentisi < / artifactId > < versiyon > 2.7 < / version > < konfigürasyon > < kodlama > UTF-8 < / kodlama > < / configuration > < /Eklenti > < ! - java derleme eklentisi - > < Eklenti > < Grup kimliği > org.apache.maven.plugins < /Grup kimliği > < artifactId > maven-derleyici eklentisi < / artifactId > < versiyon > 3.2 < / version > < konfigürasyon > < kaynak > 1.7 < /kaynak > < hedef > 1.7 < /hedef > < kodlama > UTF-8 < / kodlama > < / configuration > < /Eklenti > < / plugins > < pluginManagement > < eklentiler > < ! - Tomcat eklentisini yapılandırın - > < Eklenti > < Grup kimliği > org.apache.tomcat.maven < /Grup kimliği > < artifactId > tomcat7-maven-eklentisi < / artifactId > < versiyon > 2.2 < / version > < /Eklenti > < / plugins > < / pluginYönetim > < /inşa etmek > < / proje >Not: Dosya yüklemeyle doğrudan ilgili olan şey şudur:
< bağımlılık > < Grup kimliği > ortak dosya yükleme < /Grup kimliği > < artifactId > ortak dosya yükleme < / artifactId > < /bağımlılık >Ardından Web projesinin çekirdek dosyası web.xml var
< ? xml version = "1.0" encoding = "UTF-8"? > < web uygulaması xmlns: xsi = " xmlns = " xmlns: web = " xsi: schemaLocation = " id = "taotao" version = "2.5" > < ekran adı > pictrue-hizmeti < /ekran adı > < ! - Yükleme yay konteyneri - > < bağlam parametresi > < param-adı > contextConfigLocation < / param-adı > < param-değeri > sınıf yolu: yay / uygulamaContext - *. xml < / param-değeri > < / context-param > < dinleyici > < dinleyici sınıfı > org.springframework.web.context.ContextLoaderListener < / dinleyici sınıfı > < / dinleyici > < ! - Yazı bozuk kodunu çöz - > < filtre > < filtre adı > CharacterEncodingFilter < / filtre-adı > < filtre sınıfı > org.springframework.web.filter.CharacterEncodingFilter < / filtre sınıfı > < init-param > < param-adı > kodlama < / param-adı > < param-değeri > utf-8 < / param-değeri > < / init-param > < / filtre > < filtre eşleme > < filtre adı > CharacterEncodingFilter < / filtre-adı > < url kalıbı > / * < / url kalıbı > < / filter-mapping > < ! - springmvc'nin ön denetleyicisi - > < servlet > < servlet-adı > pictrue-hizmeti < / servlet-adı > < servlet sınıfı > org.springframework.web.servlet.DispatcherServlet < / servlet-sınıfı > < init-param > < param-adı > contextConfigLocation < / param-adı > < param-değeri > sınıf yolu: yay / springmvc.xml < / param-değeri > < / init-param > < başlangıçta yükleme > 1 < / başlangıçta yükleme > < / servlet > < sunucu uygulaması eşleme > < servlet-adı > pictrue-hizmeti < / servlet-adı > < url kalıbı > / < / url kalıbı > < / servlet-mapping > < /internet uygulaması >Sonra SpringMVC yapılandırma dosyası springmvc.xml var, bir dosya yükleme ayrıştırıcısı eklemeniz gerekiyor
< ! - Dosya yükleme ayrıştırıcısını tanımlayın - > < bean id = "multipartResolver" class = "org.springframework.web.multipart.commons.CommonsMultipartResolver" > < ! - Varsayılan kodlamayı ayarlayın - > < property name = "defaultEncoding" value = "UTF-8" > < /Emlak > < ! - Maksimum dosya yükleme boyutunu 5MB, 5 * 1024 * 1024 - > < özellik adı = "maxUploadSize" value = "5242880" > < /Emlak > < /fasulye >Son olarak, Ftp yapılandırma dosyası resource.properties
FTP_ADDRESS = 192.168.0.11 FTP_PORT = 21 FTP_USERNAME = ftpuser FTP_PASSWORD = kök FTP_BASE_PATH = / usr / local / nginx / html / images IMAGE_BASE_URL = http: //192.168.0.11/imagesHizmet katmanı
Resim yükleme arayüzü PictureService.java
paket com.itdragon.service; java.util.Map içe aktarın; import org.springframework.web.multipart.MultipartFile; genel arayüz PictureService { / ** * Yükleme, toplu yükleme arayüzü * @param uploadFile * @dönüş * / Map uploadPicture (MultipartFile uploadFile); }Resim arabirimi uygulama sınıfını yükle PictureServiceImpl.java
paket com.itdragon.service.impl; java.io.IOException ithalatı; java.io.InputStream'i içe aktarın; java.util.HashMap'i içe aktar; java.util.Map içe aktarın; org.apache.commons.net.ftp.FTP içe aktarımı; org.apache.commons.net.ftp.FTPClient içe aktarımı; org.apache.commons.net.ftp.FTPReply dosyasını içe aktarın; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; import com.itdragon.service.PictureService; @Hizmet @SuppressWarnings ({"rawtypes", "unchecked"}) public class PictureServiceImpl, PictureService'i uygular { // Yapılandırma dosyasındaki özellik değerini Spring4'ün Değer ek açıklamasıyla alın @Value ("$ {FTP_ADDRESS}") private String FTP_ADDRESS; // ftp sunucusu ip adresi @Value ("$ {FTP_PORT}") private Integer FTP_PORT; // ftp sunucu bağlantı noktası, varsayılan 21'dir @Value ("$ {FTP_USERNAME}") private String FTP_USERNAME; // ftp sunucusu kullanıcı adı @Value ("$ {FTP_PASSWORD}") private String FTP_PASSWORD; // ftp sunucu şifresi @Value ("$ {FTP_BASE_PATH}") private String FTP_BASE_PATH; // Resimleri saklamak için ftp sunucusunun mutlak yolu @ Değer ("$ {IMAGE_BASE_URL}") private String IMAGE_BASE_URL; // ftp sunucusu harici ağ erişimi resim yolu @Override public Map uploadPicture (MultipartFile uploadFile) { Harita resultMap = yeni HashMap < > (); Deneyin { // 1. Orijinal dosya adını alın String oldName = uploadFile.getOriginalFilename (); // 2. ftp sunucusunun dosya adı String newName = oldName; //resmi yükle boole sonucu = uploadFile (FTP_ADDRESS, FTP_PORT, FTP_USERNAME, FTP_PASSWORD, uploadFile.getInputStream (), FTP_BASE_PATH, newName); // Sonuç döndür eğer (! sonuç) { resultMap.put ("hata", 1); resultMap.put ("mesaj", "Yükleme Başarısız"); return resultMap; } resultMap.put ("hata", 0); resultMap.put ("url", IMAGE_BASE_URL + "/" + newName); return resultMap; } catch (İstisna e) { e.printStackTrace (); resultMap.put ("hata", 1); resultMap.put ("mesaj", "Yükleme Başarısız"); return resultMap; } } / ** * ftp resim yükleme yöntemi * @param ip ftp sunucusu ip adresi * @param port ftp server port, varsayılan 21'dir * @param hesabı ftp sunucusu kullanıcı adı * @param passwd ftp sunucu şifresi * @param inputStream dosya akışı * @param workingDir ftp sunucusunun resimleri depolamak için mutlak yolu * @param fileName ftp sunucusu dosya adına yükleme * @throws Exception * * / public boolean uploadFile (String ip, Integer port, String hesabı, String passwd, InputStream inputStream, String workingDir, String fileName) Exception { boole sonucu = yanlış; // 1. Bir FtpClient nesnesi oluşturun FTPClient ftpClient = yeni FTPClient (); Deneyin { // 2. ftp bağlantısı oluştur ftpClient.connect (ip, bağlantı noktası); // 3. ftp sunucusunda oturum açın ftpClient.login (hesap, passwd); int response = ftpClient.getReplyCode (); // Bağlantı ftp durumu dönüş değerini alın System.out.println ("kod:" + yanıt); if (! FTPReply.isPositiveCompletion (yanıt)) { ftpClient.disconnect (); // Dönüş durumu artık 200 ~ 300 değilse, bağlantının başarısız olduğu kabul edilir dönüş sonucu; } // 4. Yerel dosyayı okuyun // FileInputStream inputStream = new FileInputStream (yeni Dosya ("F: \ hello.png")); // 5. Yükleme yolunu ayarlayın ftpClient.changeWorkingDirectory (workingDir); // 6. Yüklenen dosyanın formatını ikili olarak değiştirin ftpClient.setFileType (FTP.BINARY_FILE_TYPE); // 7. Sunucu dosyaları depolar, ilk parametre sunucuda depolanan dosya adı ve ikinci parametre dosya akışıdır eğer (! ftpClient.storeFile (fileName, inputStream)) { dönüş sonucu; } // 8. Bağlantıyı kapatın inputStream.close (); ftpClient.logout (); sonuç = doğru; } catch (İstisna e) { e.printStackTrace (); }en sonunda { // FIXME Projedeki istisnaları yakalamak için en iyisinin try catch daha az kullanmak olduğunu duydum. Bu Spring işlemi geri alma sorunlarına neden olur? ? ? Daha önce yazılan kod sahte kod mu? ! ! if (ftpClient.isConnected ()) { Deneyin { ftpClient.disconnect (); } catch (IOException ioe) { } } } dönüş sonucu; } }Açıklama:
Denetleyici katmanı
Sayfa atlamasından sorumlu PageController.java
paket com.itdragon.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; @Kontroller public class PageController { / ** * Ana sayfayı açın * / @RequestMapping ("/") public String showIndex () { "indeks" döndür; } @RequestMapping ("/ {page}") public String showpage (@PathVariable String sayfası) { System.out.println ("sayfa:" + sayfa); dönüş sayfası; } }Resim yüklemesinden sorumlu PictureController.java
paket com.itdragon.controller; java.util.Map içe aktarın; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.itdragon.service.PictureService; @Filmdenkare public class PictureController { @Autowired özel PictureService pictureService; @RequestMapping ("resim / yükleme") public String pictureUpload (@RequestParam (value = "fileUpload") MultipartFile uploadFile) { Dize json = ""; Deneyin { Harita sonucu = pictureService.uploadPicture (uploadFile); // Tarayıcılar json formatındaki dizeleri işlemekte iyidir. Farklı tarayıcı çekirdeklerinin neden olduğu hataları azaltmak için json önerilir json = new ObjectMapper (). writeValueAsString (sonuç); } catch (JsonProcessingException e) { e.printStackTrace (); } json döndür; } }Açıklama:
Görünüm katmanı
Resimlerin yüklenmesinden sorumlu jsp sayfası pic-upload.jsp
< % @ page language = "java" contentType = "text / html; UTF-8" pageEncoding = "UTF-8"% > < ! DOCTYPE html > < html > < baş > < meta http-equiv = "İçerik Türü" content = "text / html; charset = UTF-8" > < Başlık > ITDragon resim yükleme < /Başlık > < / kafa > < link href = "/ js / kindeditor-4.1.10 / temalar / default / default.css" type = "text / css" rel = "stylesheet" > < script type = "text / javascript" src = "js / jquery.min.js" > < /senaryo > < script type = "text / javascript" charset = "utf-8" src = "/ js / kindeditor-4.1.10 / kindeditor-all-min.js" > < /senaryo > < script type = "text / javascript" charset = "utf-8" src = "/ js / kindeditor-4.1.10 / lang / zh_CN.js" > < /senaryo > < / kafa > < vücut > < h3 > Görüntü yükleme işlevi arayüzünün form formunu test edin < / h3 > < form eylem = "resim / yükleme" method = "post" enctype = "multipart / form-data" > < input type = "file" name = "fileUpload" / > < input type = "submit" value = "Dosya yükle" / > < /form > < hr / > < h3 > Resimlerin toplu olarak yüklenmesini gerçekleştirmek için KindEditor zengin metin düzenleyicisini ödünç alın < / h3 > < textarea id = "kindEditorDesc" style = "genişlik: 800px; yükseklik: 300px; görünürlük: gizli;" > < / textarea > < script type = "text / javascript" > $ (işlev () { // Zengin metin düzenleyiciyi başlatın KindEditor.create ("# kindEditorDesc", { // İsim değeri Kontrolörün parametrelerine karşılık gelmelidir, aksi takdirde 400 hatası istenir filePostName: "fileUpload", // eylem değeri, uploadJson: '/ pic / upload', // Görüntü, flash, medya, dosya sırasıyla yükleme türünü ayarlayın dir: "resim" }); }); < /senaryo > < /vücut > < / html >Not: pic-upload.jsp iki bölüme ayrılmıştır, ilk bölüm resim yüklemek için form formunun test edilmesidir. İkinci bölüm, daha iyi bir deneyim için yükleme, toplu yükleme ve yankı işlevlerine sahip KindEditer zengin metin düzenleyicisidir.
Kaynak kodu: https://github.com/ITDragonBlog/daydayup/tree/master/Nginx
Nginx buradaki resim sunucusu yapısının sonudur, herhangi bir eksiklik varsa lütfen beni aydınlatın. İyi olduğunu düşünüyorsanız, beğenebilirsiniz!
Kaynak:WeChat Kimliğini (ID: Taro Kaynak Kodu) arayarak, çeşitli Java kaynak kodu analizleri alabilirsiniz.
Ayrıca, [Kitaplar] 'a yanıt verdikten sonra, girişten mimariye kadar yazarın önerdiği çeşitli Java kitapları alabilirsiniz.
Hadi, Sao Nian ~