文件上传与读取
文件上传的基本思路:
将文件通过流的方式写入相对于当前项目的一个的文件夹中(这种方式是将图片放入tomcat容器中的)
读取的时候直接获取其(请求路径(存入数据库的路径))
请求路径一般为当前项目的ContextPath 加上 相对于该项目的存放文件的路径
即 contextPath + upload
(通过文件流的方式读取也行)
基本流程:
引入第三方jar包 commons-fileupload.jar
获取当前项目的ContextPath路径
public static ServletContext getContext() {
if(null == context){
throw new RuntimeException("项目启动失败,或者项目已停止");
}
return context;
}
public static void setContext(ServletContext context) {
CommonUtil.context = context;
}
指定文件存储的相对于该项目的文件夹的路径
(1)从.properties文件中读取(file.properties)
文件:例:environment=development //environment:文件上传路径的前缀
development.path=../upload //.path为文件上传的后缀
(2)加载配置文件(获取相对于当前项目的存放文件路径)
例:private static void loadProperties() {
Properties p = new Properties();
try {
p.load(CommonUtil.class.getClassLoader().getResourceAsStream("file.properties"));
String key = p.getProperty(Constant.UPLOAD_PATH_PREFIX);
uploadPath = p.getProperty(key + Constant.UPLOAD_PATH_SUFFIX);
} catch (IOException e) {
throw new IllegalArgumentException("file.properties配置文件未找到", e);
}
if(null == uploadPath){
throw new IllegalArgumentException("文件上传路径获取失败");
}
}
文件上传路径
获取相对于当前项目的存放文件路径的真实路径
public static String getUploadPath(){
String realPath = getContext().getRealPath(uploadPath);
File f = new File(realPath);
if(!f.exists()){
boolean flag = f.mkdirs();
if(!flag){
throw new IllegalArgumentException("文件上传路径创建失败:" + realPath);
}
}
return realPath;
}
5.文件读取是的路径contextPath + upload
public static String getContextPath(){
if(null == contextPath){
contextPath = getContext().getContextPath() + "/" + uploadPath;
}
return contextPath;
}
public static ServletContext getContext() {
if(null == context){
throw new RuntimeException("项目启动失败,或者项目已停止");
}
return context;
}
public static void setContext(ServletContext context) {
CommonUtil.context = context;
}
最后获取文件集合
public static Map<String, Object> getParamsFromRequest(HttpServletRequest request) throws Exception {
// 使用第三方的jar包,commons-fileupload.jar 实现文件上传
// 获取DiskFileItem的工厂
DiskFileItemFactory factory = new DiskFileItemFactory();
// 创建解析工具
ServletFileUpload upload = new ServletFileUpload(factory);
List<FileItem> fileItemList = upload.parseRequest(request);
// 自定义存放上传的文件类的容器
List<CommonsMultipartFile> multiFileList = new ArrayList<CommonsMultipartFile>();
// 自定义Request类
Map<String, Object> map = new HashMap<String, Object>();
for (FileItem fi : fileItemList) {
// 如果是普通输入框(如果非文件上传框)
if(fi.isFormField())
{
// 放到request中
String key = fi.getFieldName();
String value = fi.getString("UTF-8");
map.put(key, value);
}
if(!fi.isFormField())
{
// 创建文件对象
CommonsMultipartFile multiFile = new CommonsMultipartFile(fi);
multiFileList.add(multiFile);
}
}
map.put("fileList", multiFileList);
return map;
}
注意点:
在eclipse中,tomcat部署项目时
会将发布的项目部署到了eclipse“克隆”webapps目录得到的一个目录中
所以会导致获取一大串存放文件的路径的克隆地址(这会导致你无法访问即读取到该图片)
解决方案:
双击servers下的tomcat:
将server Locations 中修改为第二项 Use Tomcat installation---- 在将下方的Deploy path
修改为你的Tomcat下的webapps目录