实现功能:
在Linux系统上的Nginx服务器上配置图片访问路径,通过浏览器访问指定路径中的图片,实现图片上传功能。
Linux中图片的位置:
nginx.conf文件的配置:
#图片代理服务器
server {
listen 8089;
server_name 192.168.16.88;
#charset koi8-r;
#access_log logs/host.access.log main;
location /accessory/ {
root /home;
autoindex on; #以文件夹的形式进行展示
}
location / {
root html;
index index.html index.htm;
}
}
浏览器中进行访问:
下面介绍配置中可能出现的问题:
1. 每次修改时记得重新加载nginx 命令:nginx -s reload;
2.通过浏览器访问时404错误,图片的位置如下:
这是文件找不到错误,原因是根路径配置错误,root配置的意思是,会在root配置的目录后跟上URL,也就是会把location后面的路径拼接到root之后,我们可以把root后面的路径去掉,或者使用alias配置访问路径。
使用alias配置访问路径配置如下:
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location /img {
alias /home/imgs/img; # alias指定图片路径
autoindex on;
}
location / {
root html;
index index.html index.htm;
}
浏览器进行访问:
3. 把图片放的不同的目录下时,需要的配置有差别呦。当把图片放在/home目录下的文件夹中,以下可以正常访问。若放在/usr下的文件夹中,需要把配置中#user nobody;注释打开。
在项目中,我们往往会把图片存放到nginx中实现动静分离,提高访问的速度,同时也减轻服务器的压力。
java实现图片上传到nginx
1. 添加maven依赖
<!-- 上传文件 -->
<dependency>
<groupId>com.jcraft</groupId>
<artifactId>jsch</artifactId>
<version>0.1.49</version>
</dependency>
2. 工具类
/**
* @ClassName: SFTP
* @Description: sftp连接工具类
*
* @version 1.0.0
*/
public class Sftp {
private transient Logger log = LoggerFactory.getLogger(this.getClass());
private ChannelSftp sftp;
private Session session;
/** FTP 登录用户名 */
private String username;
/** FTP 登录密码 */
private String password;
/** 私钥 */
private String privateKey;
/** FTP 服务器地址IP地址 */
private String host;
/** FTP 端口 */
private int port;
/**
* 构造基于密码认证的sftp对象
*
* @param userName
* @param password
* @param host
* @param port
*/
public Sftp(String username, String password, String host, int port) {
this.username = username;
this.password = password;
this.host = host;
this.port = port;
}
/**
* 构造基于秘钥认证的sftp对象
*
* @param userName
* @param host
* @param port
* @param privateKey
*/
public Sftp(String username, String host, int port, String privateKey) {
this.username = username;
this.host = host;
this.port = port;
this.privateKey = privateKey;
}
public Sftp() {
}
/**
* 连接sftp服务器
*
* @throws Exception
*/
public void login() {
try {
JSch jsch = new JSch();
if (privateKey != null) {
jsch.addIdentity(privateKey);// 设置私钥
log.info("sftp connect,path of private key file:{}", privateKey);
}
log.info("sftp connect by host:{} username:{}", host, username);
session = jsch.getSession(username, host, port);
log.info("Session is build");
if (password != null) {
session.setPassword(password);
}
Properties config = new Properties();
config.put("StrictHostKeyChecking", "no");
session.setConfig(config);
session.connect();
log.info("Session is connected");
Channel channel = session.openChannel("sftp");
channel.connect();
log.info("channel is connected");
sftp = (ChannelSftp) channel;
log.info(String.format("sftp server host:[%s] port:[%s] is connect successfull", host, port));
} catch (JSchException e) {
log.error("Cannot connect to specified sftp server : {}:{} \n Exception message is: {}",
new Object[] { host, port, e.getMessage() });
}
}
/**
* 关闭连接 server
*/
public void logout() {
if (sftp != null) {
if (sftp.isConnected()) {
sftp.disconnect();
log.info("sftp is closed already");
}
}
if (session != null) {
if (session.isConnected()) {
session.disconnect();
log.info("sshSession is closed already");
}
}
}
/**
* 将输入流的数据上传到sftp作为文件
*
* @param directory 上传到该目录
* @param sftpFileName sftp端文件名
* @param in 输入流
* @throws SftpException
* @throws Exception
*/
public void upload(String directory, String sftpFileName, InputStream input) throws SftpException {
try {
sftp.cd(directory);
} catch (SftpException e) {
log.warn("directory is not exist");
sftp.mkdir(directory);
sftp.cd(directory);
}
sftp.put(input, sftpFileName);
log.info("file:{} is upload successful", sftpFileName);
}
}
3. 配置文件
# 账号
linux.username=root
# 密码
linux.password=root
# ip路径
linux.ip=虚拟机路径
# 虚拟机端口号
linux.id=22
# nginx端口
linux.nginx.port=8089
# 上传根目录
linux.nginx.uploadPath=/home/accessory
# 文件上传访问路径
linux.nginx.downPath=/accessory/
nginx的配置文件和上面第一个配置文件相同,此处省略。
4. java代码实现
@Controller
@RequestMapping("/upload")
public class FileUploadController {
public static String USERNAME = PropertiesUtil.LINUX_USERNAME;
public static String PASSWORD = PropertiesUtil.LINUX_PASSWORD;
public static String IP = PropertiesUtil.LINUX_IP;
public static Integer ID = Integer.valueOf(PropertiesUtil.LINUX_ID);
public static String UPLOAD_PATH = PropertiesUtil.LINUX_NGINX_UPLOADPATH;
public static String DOWN_PATH = PropertiesUtil.LINUX_NGINX_DOWNPATH;
public static String PORT = PropertiesUtil.LINUX_NGINX_PORT;
/**
* 上传文件
* @param carOrders
* @return
* @throws IOException
*/
@RequestMapping("/img")
@ResponseBody
public Map<String,Object> img(MultipartFile file) throws IOException {
//实例化工具类,填写用户名,密码,ip地址,端口号,用来连接linux
SftpUtil sftpUtil = new SftpUtil(USERNAME, PASSWORD, IP, ID);
//连接服务器
sftpUtil.login();
Map<String,Object> map = new HashMap<String,Object>();
try {
String picname = UUID.randomUUID().toString().replaceAll("-", "");
String originalFilename = file.getOriginalFilename();
String string = originalFilename.substring(originalFilename.lastIndexOf("."));
String filename = picname+string;
//上传文件
System.out.println(UPLOAD_PATH+"================");
sftpUtil.upload(UPLOAD_PATH, filename, file.getInputStream());
String savePath = DOWN_PATH+filename;
//返回json
map.put("msg","ok");
map.put("code",200);
/*加不加这个都行*/
map.put("data",new HashMap<String,Object>(){
{
put("src",savePath);
}
});
} catch (Exception e) {
map.put("msg","error");
map.put("code",0);
e.printStackTrace();
System.out.println("上传失败");
} finally {
//释放连接
sftpUtil.logout();
}
return map;
}
}
5. 前端页面正常书写,此处省略。
以上就是nginx作为图片服务器的一个小demo,希望可以帮助到看到的小伙伴。