springboot
在springboot中,上传图片或文件上传成功后,却无法访问。
在springboot中,用相对的路径储存,也只是存储在临时的目录,一重启文件就会没有了。并且打为jar后,存入文件也会有问题。
这时,需要配置一个虚拟路径,映射到物理路径上。比如在服务器将文件存在/usr/upload文件夹下,同时映射的路径为http://localhost:8080/image。那么处理上传文件的后台程序则写入文件/usr/upload文件夹下,通过浏览器访问localhost:8080/image/xxx.png,就相当于访问/usr/upload文件夹的xxx.png。
具体的实现步骤-》
前端使用的参考博客园,使用的是TinyMCE编辑器。粘贴图片,就可以上传。
这个异步不是使用form,所以不讨论上传的工具类。
在后端中,处理上传的handler:
import com.hj.blog.service.UploadService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import java.io.*;
@RestController
public class UploadHandler {
private Logger logger = LoggerFactory.getLogger(UploadHandler.class);
@Autowired
private UploadService uploadService;
@RequestMapping("/uploadimg")
public String uploadimg(HttpServletRequest request) throws IOException, ServletException {
// handler调用文件上传的service 得到文件的虚拟路径
String filepath = uploadService.uploadImg(request);
return filepath;
}
}
处理文件上传的service,在service中将上传的文件夹和映射的文件夹都放在配置文件中:
package com.hj.blog.service;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import java.io.*;
import java.text.SimpleDateFormat;
import java.util.*;
@Service
public class UploadService {
private Logger logger = LoggerFactory.getLogger(UploadService.class);
// 文件的真实路径
@Value("${file.uploadFolder}")
private String realBasePath;
@Value("${file.accessPath}")
private String accessPath;
public String uploadImg(HttpServletRequest request) throws IOException, ServletException {
InputStream inputStream = request.getInputStream();
//获取请求头中Contect-Type的值
// 图片后缀
String imgSuffix = "png";
Enumeration enumeration=request.getHeaderNames();
while(enumeration.hasMoreElements()) {
String name=(String)enumeration.nextElement();
if(name.equals("content-type")){
String value=request.getHeader(name);
imgSuffix = value.split("/")[1];
logger.info("header中" + name + " " + value);
logger.info("文件后缀:" + imgSuffix);
}
}
// 文件唯一的名字
String fileName = UUID.randomUUID().toString() + "." +imgSuffix;
Date todayDate = new Date();
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
String today = dateFormat.format(todayDate);
// 域名访问的相对路径(通过浏览器访问的链接-虚拟路径)
String saveToPath = accessPath + today + "/";
// 真实路径,实际储存的路径
String realPath = realBasePath + today + "/";
// 储存文件的物理路径,使用本地路径储存
String filepath = realPath + fileName;
logger.info("上传图片名为:" + fileName+"--虚拟文件路径为:" + saveToPath +"--物理文件路径为:" + realPath);
// 判断有没有对应的文件夹
File destFile = new File(filepath);
if (!destFile.getParentFile().exists()) {
destFile.getParentFile().mkdirs();
}
// 输出流 输出到文件
OutputStream outputStream = new FileOutputStream(destFile);
// 缓冲区
byte[] bs = new byte[1024];
int len = -1;
while ((len = inputStream.read(bs)) != -1) {
outputStream.write(bs,0,len);
}
inputStream.close();
outputStream.close();
// 返回虚拟路径,给链接访问
return saveToPath+fileName;
}
}
application.properties:
# 上传的服务器上的映射文件夹
file.accessPath=/uploadimg/
#静态资源对外暴露的访问路径
file.staticAccessPath=/uploadimg/**
#文件上传目录(注意Linux和Windows上的目录结构不同)
#file.uploadFolder=/root/uploadFiles/
file.uploadFolder=C://File_rec/tmp/
关键的配置类
package com.hj.blog.config;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
/**
* 设置虚拟路径,访问绝对路径下资源
*/
@Configuration
public class UploadConfig implements WebMvcConfigurer{
@Value("${file.staticAccessPath}")
private String staticAccessPath;
@Value("${file.uploadFolder}")
private String uploadFolder;
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler(staticAccessPath).addResourceLocations("file:" + uploadFolder);
}
}
通过最后的配置类,设置了虚拟的路径到物理的路径中。也可以正常的访问图片了。
javaweb
Tomcat上传图片、文件等到项目目录外的其他存储位置
使用 Tomcat 作为服务器的时候,如果将上传文件保存在项目路径下,每次重启服务或者打成 war 包的时候很容易丢失上传的文件,另外就是文件多了,Tomcat容易崩,于是我们配置 Tomcat 把文件保存到项目外的其他磁盘路径:
打开 Tomcat conf 文件夹下的 server.xml 文件,在 Host 节点下添加如下配置:
<Context docBase="E:\picture" path="/pp" reloadable="true"/>
注:
1、docBase是你的服务器绝对路径的位置,注意放到Tomcat之外的位置,尽量其他文件或程序用不到的位置。
2、path是文件访问路径,我这里设置了/pp,我的tomcat地址是 localhost:8089,我在E:\picture下面存几张图片。
3、那么我要访问我的图片的地址就是localhost:8089/pp/1.jpg
如图:(浏览器中可以直接访问)
4、如果部署服务,将localhost配置成服务器的地址即可。
Javaweb项目读取本地图片通过虚拟路径
最近在做的一个项目涉及到这方面的问题,花了一天的时间才解决,其实挺简单的,所以记录下来供大家参考
从本地读取图片,首先找到图片的位置(比如我的图片放在D:\tupian\upload),然后在tomcat下的server.xml进行配置,也称为虚拟路径
在server.xml的Host下面配置
(path="/upload"这里path的值是任意取的,但是jsp里是需要使用的)
在jsp里面获取图片的路径(我这里的的img src路径是拼接迭代出来的),如果不拼接就是这样
然后在编译器(eclipse或者其他编译器)的service下双击tomcat,然后点击Modules,打开Modules后,在右侧点击Add External Web Modules 添加刚才配置的虚拟路径
然后重启tomcat和编译器,客户端访问就可以看到图片了
IDEA 中tomcat图片储存和访问虚拟路径
前段时间,遇到了图片已经储存了文件中也显示有图片,但就是死活访问不到。折腾了半天才给弄出来,原来是tomcat没有配置图片的虚拟访问路径。
准备开搞
1)在tomcat的server.xml中配置如下图
2.1在IDEA中修改tomcat的图片访问路径,选中Edit Configuration… 在点击Deployment 如图:
2.2点击“+”号,点击External Source…选择你在server.xml中配置的文件夹名称和位置
2.3在Application context 中配置如下内容
这就完事了 ,现在就可以访问图片了
来源:
1:【Springboot】springboot中上传图片的访问不了,配置虚拟化路径解决(后端)
2:Tomcat上传图片、文件等到项目目录外的其他存储位置 Javaweb项目通过虚拟路径读取本地图片