您好,登錄后才能下訂單哦!
這篇文章主要講解了“SpringBoot+nginx怎么實現資源上傳功能”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“SpringBoot+nginx怎么實現資源上傳功能”吧!
1.nginx安裝及配置
小編使用的服務器是阿里云的輕量應用服務器,系統使用的是ubuntu。注意記得開放 9090tcp端口,如果不使用 9090端口作為服務器端口也可不用。
安裝
首先,獲取安裝包是必要的吧,這里提供一個nginx-1.11.3-ubuntu.tar.gz https://pan.baidu.com/s/1vvb41qkoj4vqfyfckxbkja (密碼45wz)
小編是將安裝包放在/usr/nginx 中,進入目錄下然后執行 tar -zxvf nginx-1.11.3.tar.gz
進行解壓
配置
修改 /usr/nginx/conf/nginx.conf :
server { listen 9090; server_name localhost; location ~ .(jpg|png|jpeg|gif|bmp)$ { #可識別的文件后綴 root /usr/nginx/image/; #圖片的映射路徑 autoindex on; #開啟自動索引 expires 1h; #過期時間 } location ~ .(css|js)$ { root /usr/nginx/static/; autoindex on; expires 1h; } location ~ .(avi|mov|rmvb|rm|flv|mp4|3gp)$ { root /usr/nginx/video/; autoindex on; expires 1h; }
該修改的修改,該增加的增加,切記勿亂刪
最后一步,啟動nginx,執行 ./usr/nginx/sbin/nginx
到這里服務器nginx就準備可以了
你可以試下在 /usr/nginx/image 下放圖片01.jpg,然后在本地 看看圖片能否訪問到
2. springboot 實現資源的上傳
pom.xml:
<parent> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-starter-parent</artifactid> <version>2.1.7.release</version> </parent> <dependencies> <dependency> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-starter-web</artifactid> <version>2.1.7.release</version> </dependency> <dependency> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-starter-test</artifactid> <version>2.1.7.release</version> <scope>test</scope> </dependency> <!-- apache工具組件 --> <dependency> <groupid>org.apache.commons</groupid> <artifactid>commons-lang3</artifactid> <version>3.8.1</version> </dependency> <dependency> <groupid>org.apache.commons</groupid> <artifactid>commons-io</artifactid> <version>1.3.2</version> </dependency> <dependency> <groupid>commons-net</groupid> <artifactid>commons-net</artifactid> <version>3.6</version> </dependency> <!-- 文件上傳組件 --> <dependency> <groupid>commons-fileupload</groupid> <artifactid>commons-fileupload</artifactid> <version>1.3.3</version> </dependency> <dependency> <groupid>org.projectlombok</groupid> <artifactid>lombok</artifactid> <version>1.16.22</version> </dependency> <dependency> <groupid>com.jcraft</groupid> <artifactid>jsch</artifactid> <version>0.1.54</version> </dependency> <dependency> <groupid>joda-time</groupid> <artifactid>joda-time</artifactid> <version>2.10.3</version> </dependency> </dependencies>
appilcation.yml:
ftp: host: 自己服務器ip username: 服務器賬號 password: 服務器密碼 port: 22 rootpath: /usr/nginx/image img: url: http://ip:9090/ # ftp.img.url 可以不添加,這里只是為了上傳文件成功后返回文件路徑
工具類 ftputil.class:
import com.jcraft.jsch.*; import org.slf4j.logger; import org.slf4j.loggerfactory; import org.springframework.beans.factory.annotation.value; import org.springframework.stereotype.component; import java.io.inputstream; import java.util.properties; @component public class ftputil { private static logger logger = loggerfactory.getlogger(ftputil.class); /** * ftp服務器ip地址 */ private static string host; @value("${ftp.host}") public void sethost(string val){ ftputil.host = val; } /** * 端口 */ private static int port; @value("${ftp.port}") public void setport(int val){ ftputil.port = val; } /** * 用戶名 */ private static string username; @value("${ftp.username}") public void setusername(string val){ ftputil.username = val; } /** * 密碼 */ private static string password; @value("${ftp.password}") public void setpassword(string val){ ftputil.password = val; } /** * 存放圖片的根目錄 */ private static string rootpath; @value("${ftp.rootpath}") public void setrootpath(string val){ ftputil.rootpath = val; } /** * 存放圖片的路徑 */ private static string imgurl; @value("${ftp.img.url}") public void setimgurl(string val){ ftputil.imgurl = val; } /** * 獲取連接 */ private static channelsftp getchannel() throws exception{ jsch jsch = new jsch(); //->ssh root@host:port session sshsession = jsch.getsession(username,host,port); //密碼 sshsession.setpassword(password); properties sshconfig = new properties(); sshconfig.put("stricthostkeychecking", "no"); sshsession.setconfig(sshconfig); sshsession.connect(); channel channel = sshsession.openchannel("sftp"); channel.connect(); return (channelsftp) channel; } /** * ftp上傳圖片 * @param inputstream 圖片io流 * @param imagepath 路徑,不存在就創建目錄 * @param imagesname 圖片名稱 * @return urlstr 圖片的存放路徑 */ public static string putimages(inputstream inputstream, string imagepath, string imagesname){ try { channelsftp sftp = getchannel(); string path = rootpath + imagepath + "/"; createdir(path,sftp); //上傳文件 sftp.put(inputstream, path + imagesname); logger.info("上傳成功!"); sftp.quit(); sftp.exit(); //處理返回的路徑 string resultfile; resultfile = imgurl + imagepath + imagesname; return resultfile; } catch (exception e) { logger.error("上傳失敗:" + e.getmessage()); } return ""; } /** * 創建目錄 */ private static void createdir(string path,channelsftp sftp) throws sftpexception { string[] folders = path.split("/"); sftp.cd("/"); for ( string folder : folders ) { if ( folder.length() > 0 ) { try { sftp.cd( folder ); }catch ( sftpexception e ) { sftp.mkdir( folder ); sftp.cd( folder ); } } } } /** * 刪除圖片 */ public static void delimages(string imagesname){ try { channelsftp sftp = getchannel(); string path = rootpath + imagesname; sftp.rm(path); sftp.quit(); sftp.exit(); } catch (exception e) { e.printstacktrace(); } } }
工具類idutils.class(修改上傳圖片名):
import java.util.random; public class idutils { /** * 生成隨機圖片名 */ public static string genimagename() { //取當前時間的長整形值包含毫秒 long millis = system.currenttimemillis(); //加上三位隨機數 random random = new random(); int end3 = random.nextint(999); //如果不足三位前面補0 string str = millis + string.format("%03d", end3); return str; } }
nginxservice.class:
import com.wzy.util.ftputil; import com.wzy.util.idutils; import lombok.extern.slf4j.slf4j; import org.joda.time.datetime; import org.springframework.stereotype.service; import org.springframework.web.multipart.multipartfile; import java.io.ioexception; import java.io.inputstream; /** * @package: com.wzy.service * @author: clarence1 * @date: 2019/10/4 21:34 */ @service @slf4j public class nginxservice { public object uploadpicture(multipartfile uploadfile) { //1、給上傳的圖片生成新的文件名 //1.1獲取原始文件名 string oldname = uploadfile.getoriginalfilename(); //1.2使用idutils工具類生成新的文件名,新文件名 = newname + 文件后綴 string newname = idutils.genimagename(); assert oldname != null; newname = newname + oldname.substring(oldname.lastindexof(".")); //1.3生成文件在服務器端存儲的子目錄 string filepath = new datetime().tostring("/yyyymmdd/"); //2、把圖片上傳到圖片服務器 //2.1獲取上傳的io流 inputstream input = null; try { input = uploadfile.getinputstream(); } catch (ioexception e) { e.printstacktrace(); } //2.2調用ftputil工具類進行上傳 return ftputil.putimages(input, filepath, newname); } }
nginxcontroller.class:
import com.fasterxml.jackson.core.jsonprocessingexception; import com.fasterxml.jackson.databind.objectmapper; import com.wzy.service.nginxservice; import lombok.extern.slf4j.slf4j; import org.springframework.beans.factory.annotation.autowired; import org.springframework.web.bind.annotation.postmapping; import org.springframework.web.bind.annotation.requestparam; import org.springframework.web.bind.annotation.restcontroller; import org.springframework.web.multipart.multipartfile; import java.util.hashmap; import java.util.map; @restcontroller @slf4j public class nginxcontroller { @autowired private nginxservice nginxservice; /** * 可上傳圖片、視頻,只需在nginx配置中配置可識別的后綴 */ @postmapping("/upload") public string pictureupload(@requestparam(value = "file") multipartfile uploadfile) { long begin = system.currenttimemillis(); string json = ""; try { object result = nginxservice.uploadpicture(uploadfile); json = new objectmapper().writevalueasstring(result); } catch (jsonprocessingexception e) { e.printstacktrace(); } long end = system.currenttimemillis(); log.info("任務結束,共耗時:[" + (end-begin) + "]毫秒"); return json; } @postmapping("/uploads") public object picturesupload(@requestparam(value = "file") multipartfile[] uploadfile) { long begin = system.currenttimemillis(); map<object, object> map = new hashmap<>(10); int count = 0; for (multipartfile file : uploadfile) { object result = nginxservice.uploadpicture(file); map.put(count, result); count++; } long end = system.currenttimemillis(); log.info("任務結束,共耗時:[" + (end-begin) + "]毫秒"); return map; } }
啟動項目,postman神器一波
注意:
1.如果要視頻跟圖片一起上傳的話,只要修改 nginx.conf配置文件,添加相應的視頻后綴即可,代碼沒變,上傳后也是放在 /usr/image 下,要不然文件能上傳,但是訪問不了
2.上面代碼 uploads接口是實現多文件上傳
感謝各位的閱讀,以上就是“SpringBoot+nginx怎么實現資源上傳功能”的內容了,經過本文的學習后,相信大家對SpringBoot+nginx怎么實現資源上傳功能這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。