private static final List<Map<String, Object>> db;

private static final List<Map<String, Object>> db;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
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");
     
     
}

http://img1.sycdn.imooc.com//climg/5a58b93e00015cdb09520154.jpg

错误信息:Unhandled exception type IOException!!!

这咋办啊?试了很多方法就是不行,老师您给看一下。

正在回答

登陆购买课程后可参与讨论,去登陆

2回答

你的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类。

先理清类之间的调用关系,如果有问题再提问。祝学习愉快!

  • 高为砚 提问者 #1
    老师,那我要获取uploadFile()方法的Map<String,String>集合可不可以这样写: 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(); } } }
    2018-01-14 13:49:53
  • 高为砚 提问者 #2
    这个不算。。。老师你看我上面新回答的。。。。
    2018-01-14 13:51:29
提问者 高为砚 2018-01-14 13:50:44
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
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();
            }
        }
}


问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
从网页搭建入门Java Web2018版
  • 参与学习           人
  • 提交作业       1088    份
  • 解答问题       10204    个

如果你有Java语言基础,又想以后从事Java Web开发,那么本路径是你的不二选择!本路径从网页搭建开始入手,通过大量案例来学习Java Web基础。定能助你完成Java Web小白的蜕变!

了解课程
请稍等 ...
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师
插入代码