Maison  >  Article  >  Java  >  Comment SpringBoot+nginx implémente la fonction de téléchargement de ressources

Comment SpringBoot+nginx implémente la fonction de téléchargement de ressources

WBOY
WBOYavant
2023-05-23 14:31:071396parcourir

1.installation et configuration de Nginx

Le serveur utilisé par l'éditeur est le serveur d'applications léger d'Alibaba Cloud que le système utilise. C'est Ubuntu. N'oubliez pas d'ouvrir le port 9090tcp. Si vous n'utilisez pas le port 9090 comme port serveur, vous n'avez pas besoin de l'utiliser.

Installation

Tout d'abord, il faut obtenir le package d'installation Voici un nginx-1.11.3-ubuntu.tar. .gz https ://pan.baidu.com/s/1vvb41qkoj4vqfyfckxbkja (mot de passe 45wz)

L'éditeur met le package d'installation dans /usr/nginx, entre dans le répertoire et exécute tar -zxvf nginx-1.11.3.tar.gz  pour décompresser # 🎜🎜#

Configuration

Modifier /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;
 }

Modification de cette modification , N'oubliez pas de ne pas supprimer les ajouts qui devraient être ajoutés

La dernière étape consiste à démarrer nginx et à exécuter ./usr/nginx/sbin/nginx

Le serveur nginx sera prêt à ce stade# 🎜🎜#

Vous pouvez essayer de télécharger l'image 01.jpg dans /usr/nginx/image, puis voir si l'image est accessible localement

#🎜🎜 #2. Implémentation de Springboot Téléchargement de ressources

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 可以不添加,这里只是为了上传文件成功后返回文件路径

Tool class 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();
  }
 }
}

Tool class idutils.class (modifier le nom de l'image téléchargée) :

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;
 }
}

Démarrer le projet, une vague d'artefacts postiers


#🎜 🎜#

Remarque : Comment SpringBoot+nginx implémente la fonction de téléchargement de ressources

1. Si vous souhaitez télécharger la vidéo avec l'image, il vous suffit de modifier le fichier de configuration nginx.conf et ajoutez le suffixe vidéo correspondant. Le code n'a pas changé, et il est également placé après le téléchargement /usr/image, sinon le fichier peut être téléchargé, mais n'est pas accessibleComment SpringBoot+nginx implémente la fonction de téléchargement de ressources

2. le code ci-dessus sert à implémenter plusieurs téléchargements de fichiers

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer