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怎麼實作資源上傳功能的詳細內容。更多資訊請關注PHP中文網其他相關文章!