這篇文章主要講解了“Nginx怎么搭建圖片服務(wù)器”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“Nginx怎么搭建圖片服務(wù)器”吧!
成都創(chuàng)新互聯(lián)公司網(wǎng)站建設(shè)公司一直秉承“誠信做人,踏實(shí)做事”的原則,不欺瞞客戶,是我們最起碼的底線! 以服務(wù)為基礎(chǔ),以質(zhì)量求生存,以技術(shù)求發(fā)展,成交一個客戶多一個朋友!專注中小微企業(yè)官網(wǎng)定制,成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站制作,塑造企業(yè)網(wǎng)絡(luò)形象打造互聯(lián)網(wǎng)企業(yè)效應(yīng)。
效果圖:
需求:實(shí)現(xiàn)圖片的上傳和批量上傳
技術(shù):nginx,vsftpd,spring,springmvc,kindeditor,centos
說明:本章節(jié)內(nèi)容主要是實(shí)現(xiàn)圖片的上傳功能。使用 kindediter 是為了更好的演示圖片的上傳,回顯,批量效果。后臺代碼與kindediter沒有直接關(guān)系,放心閱讀。另外源碼中有mybatis的jar,不用理會,本章內(nèi)容用不到,是為后續(xù)內(nèi)容做準(zhǔn)備!
源碼:見文章底部
場景:用戶將圖片上傳到 tomcat 服務(wù)器上,再由 tomcat 服務(wù)器通過ftp上傳到 nginx 服務(wù)器上。
項(xiàng)目結(jié)構(gòu):
單元測試
首先要攻破核心技術(shù)。通過單元測試實(shí)現(xiàn)圖片上傳的功能。
package com.itdragon.test; import java.io.file; import java.io.fileinputstream; import org.apache.commons.net.ftp.ftp; import org.apache.commons.net.ftp.ftpclient; import org.junit.test; public class pictureftptest { // 測試 ftp 上傳圖片功能 @test public void testftpclient() throws exception { // 1. 創(chuàng)建一個ftpclient對象 ftpclient ftpclient = new ftpclient(); // 2. 創(chuàng)建 ftp 連接 ftpclient.connect("192.168.0.11", 21); // 3. 登錄 ftp 服務(wù)器 ftpclient.login("ftpuser", "root"); // 4. 讀取本地文件 fileinputstream inputstream = new fileinputstream(new file("f:\\hello.png")); // 5. 設(shè)置上傳的路徑 ftpclient.changeworkingdirectory("/usr/local/nginx/html/images"); // 6. 修改上傳文件的格式為二進(jìn)制 ftpclient.setfiletype(ftp.binary_file_type); // 7. 服務(wù)器存儲文件,第一個參數(shù)是存儲在服務(wù)器的文件名,第二個參數(shù)是文件流 ftpclient.storefile("hello.jpg", inputstream); // 8. 關(guān)閉連接 ftpclient.logout(); } }
說明:這里的ip地址,端口,ftp用戶名,密碼,本地文件路徑,以及nginx服務(wù)器圖片路徑等,這些字符串參數(shù)都要根據(jù)自己實(shí)際設(shè)置的來填寫的。如果你的nginx和vsftpd安裝是按照我提供的鏈接來做的。那你只需要改ip地址即可。
maven 的web 項(xiàng)目
搭建maven的web 項(xiàng)目,之前有寫過。這里就不過多描述。
項(xiàng)目核心配置文件
首先是 maven 的核心文件 pom.xml
4.0.0 com.itdragon.upload pictrue-service 0.0.1-snapshot war 4.12 4.1.3.release 3.2.8 1.2.2 1.2.15 5.1.6 1.6.4 2.4.2 1.0.9 4.3.5 1.2 2.5 2.0 2.5 3.3.2 1.3.2 3.3 3.4.2 0.9.1 1.3.1 2.7.2 4.10.3 joda-time joda-time ${joda-time.version} org.apache.commons commons-lang3 ${commons-lang3.version} org.apache.commons commons-io ${commons-io.version} commons-net commons-net ${commons-net.version} com.fasterxml.jackson.core jackson-databind ${jackson.version} org.apache.httpcomponents httpclient ${httpclient.version} junit junit ${junit.version} test org.slf4j slf4j-log4j12 ${slf4j.version} org.mybatis mybatis ${mybatis.version} org.mybatis mybatis-spring ${mybatis.spring.version} com.github.miemiedev mybatis-paginator ${mybatis.paginator.version} com.github.pagehelper pagehelper ${pagehelper.version} mysql mysql-connector-java ${mysql.version} com.alibaba druid ${druid.version} org.springframework spring-context ${spring.version} org.springframework spring-beans ${spring.version} org.springframework spring-webmvc ${spring.version} org.springframework spring-jdbc ${spring.version} org.springframework spring-aspects ${spring.version} jstl jstl ${jstl.version} javax.servlet servlet-api ${servlet-api.version} provided javax.servlet jsp-api ${jsp-api.version} provided commons-fileupload commons-fileupload ${commons-fileupload.version} redis.clients jedis ${jedis.version} org.apache.solr solr-solrj ${solrj.version} ${project.artifactid} org.apache.maven.plugins maven-resources-plugin 2.7 utf-8 org.apache.maven.plugins maven-compiler-plugin 3.2 1.7 utf-8 org.apache.tomcat.maven tomcat7-maven-plugin 2.2
說明:和文件上傳有直接關(guān)系的是:
commons-fileupload commons-fileupload
然后是 web 項(xiàng)目的核心文件 web.xml
pictrue-service contextconfiglocation classpath:spring/applicationcontext-*.xml org.springframework.web.context.contextloaderlistener characterencodingfilter org.springframework.web.filter.characterencodingfilter encoding utf-8 characterencodingfilter /* pictrue-service org.springframework.web.servlet.dispatcherservlet contextconfiglocation classpath:spring/springmvc.xml 1 pictrue-service /
再是 springmvc 配置文件 springmvc.xml,需要添加文件上傳解析器
最后是 ftp 配置文件 resource.properties
ftp_address=192.168.0.11 ftp_port=21 ftp_username=ftpuser ftp_password=root ftp_base_path=/usr/local/nginx/html/images image_base_url=http://192.168.0.11/images
service 層
上傳圖片的接口 pictureservice.java
package com.itdragon.service; import java.util.map; import org.springframework.web.multipart.multipartfile; public interface pictureservice { /** * 上傳,批量上傳接口 * @param uploadfile * @return */ map uploadpicture(multipartfile uploadfile); }
上傳圖片接口實(shí)現(xiàn)類 pictureserviceimpl.java
package com.itdragon.service.impl; import java.io.ioexception; import java.io.inputstream; import java.util.hashmap; import java.util.map; import org.apache.commons.net.ftp.ftp; import org.apache.commons.net.ftp.ftpclient; import org.apache.commons.net.ftp.ftpreply; import org.springframework.beans.factory.annotation.value; import org.springframework.stereotype.service; import org.springframework.web.multipart.multipartfile; import com.itdragon.service.pictureservice; @service @suppresswarnings({"rawtypes", "unchecked"}) public class pictureserviceimpl implements pictureservice { // 通過 spring4 的 value注解,獲取配置文件中的屬性值 @value("${ftp_address}") private string ftp_address; // ftp 服務(wù)器ip地址 @value("${ftp_port}") private integer ftp_port; // ftp 服務(wù)器port,默認(rèn)是21 @value("${ftp_username}") private string ftp_username; // ftp 服務(wù)器用戶名 @value("${ftp_password}") private string ftp_password; // ftp 服務(wù)器密碼 @value("${ftp_base_path}") private string ftp_base_path; // ftp 服務(wù)器存儲圖片的絕對路徑 @value("${image_base_url}") private string image_base_url; // ftp 服務(wù)器外網(wǎng)訪問圖片路徑 @override public map uploadpicture(multipartfile uploadfile) { map resultmap = new hashmap<>(); try { // 1. 取原始文件名 string oldname = uploadfile.getoriginalfilename(); // 2. ftp 服務(wù)器的文件名 string newname = oldname; //圖片上傳 boolean result = uploadfile(ftp_address, ftp_port, ftp_username, ftp_password, uploadfile.getinputstream(), ftp_base_path, newname); //返回結(jié)果 if(!result) { resultmap.put("error", 1); resultmap.put("message", "upload fail"); return resultmap; } resultmap.put("error", 0); resultmap.put("url", image_base_url + "/" + newname); return resultmap; } catch (exception e) { e.printstacktrace(); resultmap.put("error", 1); resultmap.put("message", "upload fail"); return resultmap; } } /** * ftp 上傳圖片方法 * @param ip ftp 服務(wù)器ip地址 * @param port ftp 服務(wù)器port,默認(rèn)是21 * @param account ftp 服務(wù)器用戶名 * @param passwd ftp 服務(wù)器密碼 * @param inputstream 文件流 * @param workingdir ftp 服務(wù)器存儲圖片的絕對路徑 * @param filename 上傳到ftp 服務(wù)器文件名 * @throws exception * */ public boolean uploadfile(string ip, integer port, string account, string passwd, inputstream inputstream, string workingdir, string filename) throws exception{ boolean result = false; // 1. 創(chuàng)建一個ftpclient對象 ftpclient ftpclient = new ftpclient(); try { // 2. 創(chuàng)建 ftp 連接 ftpclient.connect(ip, port); // 3. 登錄 ftp 服務(wù)器 ftpclient.login(account, passwd); int reply = ftpclient.getreplycode(); // 獲取連接ftp 狀態(tài)返回值 system.out.println("code : " + reply); if (!ftpreply.ispositivecompletion(reply)) { ftpclient.disconnect(); // 如果返回狀態(tài)不再 200 ~ 300 則認(rèn)為連接失敗 return result; } // 4. 讀取本地文件 // fileinputstream inputstream = new fileinputstream(new file("f:\\hello.png")); // 5. 設(shè)置上傳的路徑 ftpclient.changeworkingdirectory(workingdir); // 6. 修改上傳文件的格式為二進(jìn)制 ftpclient.setfiletype(ftp.binary_file_type); // 7. 服務(wù)器存儲文件,第一個參數(shù)是存儲在服務(wù)器的文件名,第二個參數(shù)是文件流 if (!ftpclient.storefile(filename, inputstream)) { return result; } // 8. 關(guān)閉連接 inputstream.close(); ftpclient.logout(); result = true; } catch (exception e) { e.printstacktrace(); }finally { // fixme 聽說,項(xiàng)目里面最好少用try catch 捕獲異常,這樣會導(dǎo)致spring的事務(wù)回滾出問題???難道之前寫的代碼都是假代碼?。。? if (ftpclient.isconnected()) { try { ftpclient.disconnect(); } catch (ioexception ioe) { } } } return result; } }
說明:
① @value 注解是spring4 中提供的,@value("${xxx}")
② 返回值是一個map,并且key有error,url,message。這是根據(jù)kindediter的語法要求來的。
controller 層
負(fù)責(zé)頁面跳轉(zhuǎn)的 pagecontroller.java
package com.itdragon.controller; import org.springframework.stereotype.controller; import org.springframework.web.bind.annotation.pathvariable; import org.springframework.web.bind.annotation.requestmapping; @controller public class pagecontroller { /** * 打開首頁 */ @requestmapping("/") public string showindex() { return "index"; } @requestmapping("/{page}") public string showpage(@pathvariable string page) { system.out.println("page : " + page); return page; } }
負(fù)責(zé)圖片上傳的 picturecontroller.java
package com.itdragon.controller; import java.util.map; 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; @restcontroller public class picturecontroller { @autowired private pictureservice pictureservice; @requestmapping("pic/upload") public string pictureupload(@requestparam(value = "fileupload") multipartfile uploadfile) { string json = ""; try { map result = pictureservice.uploadpicture(uploadfile); // 瀏覽器擅長處理json格式的字符串,為了減少因?yàn)闉g覽器內(nèi)核不同導(dǎo)致的bug,建議用json json = new objectmapper().writevalueasstring(result); } catch (jsonprocessingexception e) { e.printstacktrace(); } return json; } }
說明:
① @restcontroller 也是spring4 提供的,是 @controller + @responsebody 的組合注解。
② controller層的返回值是一個json格式的字符串。是考慮到瀏覽器對json解析兼容性比較好。
views視圖層
負(fù)責(zé)上傳圖片的jsp頁面 pic-upload.jsp
<%@ page language="java" contenttype="text/html; utf-8" pageencoding="utf-8"%>itdragon 圖片上傳 測試上傳圖片功能接口的form表單