private static final List<Map<String, Object>> db;
package com.imooc.utils;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
/**
* 文件上传工具类
* @author idea
*
*/
public class UploadUtils {
//生成随机并唯一的文件名
public static String getUUIDFileName(String fileName) {
//将文件名的前面部分进行截取,例:XX.jpg-->.jpg
//获得"."的index值
int index=fileName.lastIndexOf(".");
String extension=fileName.substring(index);//得到拓展名,例.jpg
//生成一串随机的字符串并将“-”去掉,然后加上拓展名就形成了随机并唯一的文件名
String uuidFileName=UUID.randomUUID().toString().replace("-", "")+extension;
return uuidFileName;
}
public static Map<String,String> uploadFile(HttpServletRequest request,String uploadDirection) throws IOException{
//接收数据
//文件上传基本操作
//定义一个Map集合,用于保存接收到的数据
Map<String,String> map=new HashMap<String,String>();
try {
//1、创建一个磁盘文件项目工厂对象
DiskFileItemFactory factory=new DiskFileItemFactory();
//2、创建一个核心解析类
ServletFileUpload upload=new ServletFileUpload(factory);
//3、解析request请求,返回的是List集合,List集合中存放的是FileItem对象
List<FileItem> list=upload.parseRequest(request);
//文件上传的路径
String url=null;
//4、遍历集合,取得每个FileItem对象,并判断是表单项还是文件上传项
for(FileItem fileItem:list) {
//判断是表单项还是文件上传项
if(fileItem.isFormField()) {
//判断是表单项
//获得表单项的值
String name=fileItem.getFieldName();//获得name属性值,例获得name="account"的account
String value=fileItem.getString("utf-8");//获得用户填入该表单项的值
System.out.println(value);
map.put(name, value);
}else {
//判断是文件上传项
//完成文件上传
//获得要上传的文件的名称
String fileName=fileItem.getString();
//通过工具类来获得唯一文件名
String uuidFileName=UploadUtils.getUUIDFileName(fileName);
//获得文件上传的数据
InputStream is=fileItem.getInputStream();
//获得文件上传的路径,我选择将用户上传的文件存在META-INF的upload下
String path=request.getServletContext().getRealPath(uploadDirection);
//将输入流对接到输出流
url=path+"\\"+uuidFileName;
OutputStream os=new FileOutputStream(url);
int len=0;
byte[] b=new byte[1024];
while((len=is.read(b))!=-1) {
os.write(b, 0, len);
}
is.close();
os.close();
}
}
} catch (FileUploadException e) {
e.printStackTrace();
}
return map;
}
}
package com.imooc.food;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import com.imooc.utils.UploadUtils;
/**
* 菜品数据处理类,实现菜品的增删改查
* @author idea
*
*/
public class FoodDaoImpl {
private static HttpServletRequest request;
private static final List <Map<String,String>> db=(List<Map<String, String>>) UploadUtils.uploadFile(request, "/uploadDirection");
}
错误信息:Unhandled exception type IOException!!!
这咋办啊?试了很多方法就是不行,老师您给看一下。
正在回答
你的uploadFile()方法的返回值类型是Map<String,String>,而在FoodDaoImpl类中,调用uploadFile方法后,返回值类型被强制转换成了List,这样肯定是不行的。
FoodDaoImpl是实现Food类的增删改查的类,只包含对Food类的处理,然后Servlet类会调用这个类的方法完成相应的操作。比如老师在RegistServlet中将user直接添加到了list中,而我们这里是有一个Dao类,在里面将food添加到list中,然后在servlet中创建FoodDaoImpl类的对象,然后去调用方法。也就是此处做了封装。
而关于uploadFile()方法的调用应该写在Servlet里面,用于对表单提交过来的数据进行处理。
建议你研究一下登录注册这门课程中老师的源码,然后尝试把老师写到RegistServlet中的关于表单处理的内容提取到UploadUtils中。
或者你先把所有代码都写到你的servlet里,然后再提取出来UploadUtils类。
先理清类之间的调用关系,如果有问题再提问。祝学习愉快!
package com.imooc.food;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import com.imooc.utils.UploadUtils;
import sun.security.pkcs11.Secmod.DbMode;
/**
* 菜品数据处理类,实现菜品的增删改查
* @author idea
*
*/
public class FoodDaoImpl {
private static final List<Map<String,String>> db=new ArrayList<Map<String,String>>();
//获取用户添加的菜品的Map集合
static {
HttpServletRequest request = null;
try {
db.add(UploadUtils.uploadFile(request, "/upload"));
} catch (IOException e) {
e.printStackTrace();
}
}
}- 参与学习 人
- 提交作业 1088 份
- 解答问题 10204 个
如果你有Java语言基础,又想以后从事Java Web开发,那么本路径是你的不二选择!本路径从网页搭建开始入手,通过大量案例来学习Java Web基础。定能助你完成Java Web小白的蜕变!
了解课程
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星