代码太多,就贴下代码,说下问题。
解释下代码什么意思,这是我批量上传的部分代码,例如我一起上传a.doc,b.doc,c.doc这3个word文档,那么在打印System.out.println(str);后面是我自已加了个分割符★,这句话的结果是,a.doc★b.doc★c.doc★ 是这样的结果,然后我用session存起来了。 session.setAttribute("filespath",str);
但是现在的问题来了,我在另一个jsp页面取值,String zlfielpath = (String)session.getAttribute("filespath");
然后打印结果是这样的,c.doc★ 取的值都是最后一个,我怀疑是在上传文件的时候,也是一条一条上传的,所以应该是后一条把前一条给覆盖了,所以session存的是最后一条记录
大家看下,我想把这些值都取到 List<?> items = upload.parseRequest(request);
FileItem item = null;
String fileName = null;
String str ="";
for (int i = 0 ;i < items.size(); i++){
item = (FileItem) items.get(i);
fileName = saveurl + File.separator + item.getName();
// 保存文件
if (!item.isFormField() && item.getName().length() > 0) {
item.write(new File(fileName));
str+=item.getName()+"★";//这里是把文档的名称拼起来,
System.out.println(str);
session.setAttribute("filespath",str);//然后用session存起来
} }
解释下代码什么意思,这是我批量上传的部分代码,例如我一起上传a.doc,b.doc,c.doc这3个word文档,那么在打印System.out.println(str);后面是我自已加了个分割符★,这句话的结果是,a.doc★b.doc★c.doc★ 是这样的结果,然后我用session存起来了。 session.setAttribute("filespath",str);
但是现在的问题来了,我在另一个jsp页面取值,String zlfielpath = (String)session.getAttribute("filespath");
然后打印结果是这样的,c.doc★ 取的值都是最后一个,我怀疑是在上传文件的时候,也是一条一条上传的,所以应该是后一条把前一条给覆盖了,所以session存的是最后一条记录
大家看下,我想把这些值都取到 List<?> items = upload.parseRequest(request);
FileItem item = null;
String fileName = null;
String str ="";
for (int i = 0 ;i < items.size(); i++){
item = (FileItem) items.get(i);
fileName = saveurl + File.separator + item.getName();
// 保存文件
if (!item.isFormField() && item.getName().length() > 0) {
item.write(new File(fileName));
str+=item.getName()+"★";//这里是把文档的名称拼起来,
System.out.println(str);
session.setAttribute("filespath",str);//然后用session存起来
} }
解决方案 »
- 数据库有数据resultset.next()却是false,急急啊
- jstl标签跟structs标签使用遇到的问题?
- org.apache.catalina.core.StandardWrapperValve invoke 报的是空引用异常
- could not execute query using scroll
- jetspeed安装问题
- 求助,怎样配置xfire,使其发布的webservice可以直接被http请求访问啊?
- 哪有j2ee blueprint的中文版?
- tomcat4带40个客户机以后就经常出问题,怎么解决?高手指点!
- 有不懂STRUTS的吗??公布第一次学习STRUTS的经验
- 请教:怎样引入jdom函数包?
- 痛苦中,javaMail收发邮件问题
- 线性表取范围算法
在if循环里面判断下
session.getAttri...("filespath")
先看下是否为空
为空的话新建一个,值为a.doc
非空的话先取出来
然后在后面append 星号b.doc
依次类推
你先在循环里面把session的存的东西在后台打出来,看看到底 最后一次存的啥子,如果真像你自己说的 的覆盖了你就 按一楼的方法先判断一下再进行处理
放循环外面
循环里面当然只有最后一次的了
外面也是最后一次的, List<?> items = upload.parseRequest(request);
FileItem item = null;
String fileName = null;
String str ="";
for (int i = 0 ;i < items.size(); i++){
item = (FileItem) items.get(i);
fileName = saveurl + File.separator + item.getName();
// 保存文件
if (!item.isFormField() && item.getName().length() > 0) {
item.write(new File(fileName));
str+=item.getName()+"★";//这里是把文档的名称拼起来,
System.out.println(str);
} }session.setAttribute("filespath",str);//然后用session存起来
是这个意思吗,这个也是一样的,都是最后一个值,因为批量上传也是一条一条的,所以应该最后一次总会覆盖前一条的。
每次用str = str+星号+filename;
这样才能都保存了
他的逻辑是对的的啊,他的str是在循环外面定义的,咋回事喃
还是不行,
List<?> items = upload.parseRequest(request);
FileItem item = null;
String fileName = null;
String str ="";
String tt = "";
for (int i = 0 ;i < items.size(); i++){
item = (FileItem) items.get(i);
fileName = saveurl + File.separator + item.getName();
// 保存文件
if (!item.isFormField() && item.getName().length() > 0) {
item.write(new File(fileName));
//System.out.println("路径"+item.getName()+"★");
str=item.getName()+"★";
} }
tt+=str;
session.setAttribute("filespath",tt);这样吗。
然后和你当前上传的str 拼起来不就完了
String tt = session.getAttribute("filespath") == null ? "" : session.getAttribute("filespath").toString();
提到for循环外.
session都不一样 怎么存呀
自己写个util类 定义一个公共字段 最好是MAP
每次上传按用户ID 去找这个MAP的里面的对象 也就是个字符串
然后对这个字符串操作
或者你用memcached 去存
session 本来就比较可贵 不是频繁要用的 别什么都往进扔
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
HttpSession session = request.getSession();
DiskFileItemFactory factory = new DiskFileItemFactory();
// 设置内存缓冲区,超过后写入临时文件
factory.setSizeThreshold(10240000);
// 设置临时文件存储位置
String root = request.getRealPath("")+"\\upwordzl";
String saveurl=root+"\\";
File file = new File(saveurl);
if(!file.exists())
//file.mkdirs(); 创建文件夹
factory.setRepository(file);
ServletFileUpload upload = new ServletFileUpload(factory);
// 设置单个文件的最大上传值
upload.setFileSizeMax(10002400000l);
// 设置整个request的最大值
upload.setSizeMax(10002400000l);
upload.setHeaderEncoding("UTF-8"); try {
List<?> items = upload.parseRequest(request);
FileItem item = null;
String fileName = null;
String str = "";
for (int i = 0 ;i < items.size(); i++){
item = (FileItem) items.get(i);
fileName = saveurl + File.separator + item.getName();
// 保存文件
if (!item.isFormField() && item.getName().length() > 0) {
item.write(new File(fileName));
str =item.getName()+"★";
} }
session.setAttribute("filespath",str);//session存值
} catch (FileUploadException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}这个页面比如我上传几个文件,这个页面就执行几次,所以每执行一次,session里面的值就会被后面的给覆盖掉,,,,,我想用什么办法,可以都存储下来。
每次进入action的时候 你从这个类的 map集合中 通过key值 取出保存的上传文件名字符串
假如是A用户 上传的
String fileName = map.get("A").toString();
返回的就是A用户已经上传的文件名字符串
下来你就可以
FileNameUtil.map.put("A",fileName +str);
item = (FileItem) items.get(i);
fileName = saveurl + File.separator + item.getName();
// 保存文件
if (!item.isFormField() && item.getName().length() > 0) {
item.write(new File(fileName));
str+=item.getName()+"★";//这里是把文档的名称拼起来,
System.out.println(str);
}
}
session.setAttribute("filespath",str);//这句放到循环外边
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
HttpSession session = request.getSession();
DiskFileItemFactory factory = new DiskFileItemFactory();
// 设置内存缓冲区,超过后写入临时文件
factory.setSizeThreshold(10240000);
// 设置临时文件存储位置
String root = request.getRealPath("")+"\\upwordzl";
String saveurl=root+"\\";
File file = new File(saveurl);
if(!file.exists())
//file.mkdirs(); 创建文件夹
factory.setRepository(file);
ServletFileUpload upload = new ServletFileUpload(factory);
// 设置单个文件的最大上传值
upload.setFileSizeMax(10002400000l);
// 设置整个request的最大值
upload.setSizeMax(10002400000l);
upload.setHeaderEncoding("UTF-8"); try {
List<?> items = upload.parseRequest(request);
FileItem item = null;
String fileName = null;
String str = session.getAttribute("str")==null?"":session.getAttribute("str");
for (int i = 0 ;i < items.size(); i++){
item = (FileItem) items.get(i);
fileName = saveurl + File.separator + item.getName();
// 保存文件
if (!item.isFormField() && item.getName().length() > 0) {
item.write(new File(fileName));
str =item.getName()+"★";
} }
session.setAttribute("filespath",str);//session存值
} catch (FileUploadException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
这样, 就用StringBuffer 再追加啊、 就因该可以啦
还的别的办法吗,回头我试下。stringbuffer