struts多文件上传,望高手求救。

caixinbao 2011-01-08 02:12:16
由于Struts收集到的多文件返回的是一个hashtable对象

键值是html里面file标签的name属性

现在的问题就是:

我的表单上有一个 “产品图片”输入域,后面接的是这个file标签。之后有一个按钮,动态增加 一行

我希望将“产品图片”上面的值,当做file标签的name,也就是当做hashtable里面的键值,传到action里面进行处理。

请问我该如何实现。

严格来说是一个JS的问题。。

感谢各位高手帮忙。
...全文
58 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
lgq_0714 2011-01-09
  • 打赏
  • 举报
回复


java多文件上传(通过commos包中的DiskFileUpload的类来重新封装请求)

public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
// TODO Auto-generated method stub
/*
* PicForm pForm=(PicForm)form; FormFile file=pForm.getFile();
* //获取上传的绝对路径 String
* path=this.getServlet().getServletContext().getRealPath("/upload");
* //获取文件名 String
* filename=System.currentTimeMillis()+file.getFileName(); //上传的绝对路径
* String filepath=path+"/"+filename; try { FileOutputStream fos=new
* FileOutputStream(filepath); fos.write(file.getFileData());
* fos.flush(); fos.close(); System.out.println("上传成功"); } catch
* (Exception e) { // TODO: handle exception }
*/
try {
String dir = servlet.getServletContext().getRealPath("/upload");
// String path = this.getServlet().getServletContext().getRealPath(
// "/img");
DiskFileUpload dfu = new DiskFileUpload();
// 设置上传数据的最大大小为10M。
dfu.setSizeMax(0xA00000);

// 设置内存缓冲区的阀值为512K。
dfu.setSizeThreshold(0x80000);

// 设置临时存储文件的目录为E:\fileupload。
dfu.setRepositoryPath("E:\\fileupload");

// 得到FileItem对象的列表。
List fileItems = null;

fileItems = dfu.parseRequest(request);
Iterator it = fileItems.iterator();
while (it.hasNext()) {
FileItem item = (FileItem) it.next();
String filename = new String(item.getName().getBytes(
"ISO8859-1"), "utf-8");
// System.out.println(item.getName() + item.getContentType()
// + item.getFieldName());

System.out.println(item.getContentType());
System.out.println(filename.substring(filename.lastIndexOf(".")));
String filepath = dir + "/" + filename.substring(filename.lastIndexOf("\\"));
item.write(new File(filepath));
System.out.println("success");
}
} catch (Exception e) {
e.printStackTrace();
}

return null;
}



楼主参考下,希望对你有帮助
magicluo 2011-01-09
  • 打赏
  • 举报
回复
上面有个小错误
file中的id一定要是唯一不重复的,这个插件生成的id都不一样,但name肯定一样..

你自己写js也注意。
magicluo 2011-01-09
  • 打赏
  • 举报
回复
前台js 生成<input type="file" id="uploadFile" name="uploadFile"/>
标签,你可以自己写js操作 dom来实现,也可以使用现成的东西,比如jquery-multiple-plugin 这个基于jquery的插件来进行.

例如你前台通过这个插件生成多个上传的标签
<input type="file" id="uploadFile" name="uploadFile"/>
<input type="file" id="uploadFile" name="uploadFile"/>
<input type="file" id="uploadFile" name="uploadFile"/>
...

你的action中循环遍历,然后上传就可以了.

//使用列表来接收上传文件
private List<File> uploadFile;
private List<String> uploadFileContentType;
private List<String> uploadFileFileName;

//getter和setter方法省略,注意文件命名的规则 uploadFile和标签中的name对应

//上传
if (fileCount > 0) {
for (int i = 0; i < uploadFile.size(); i++) {

if (null != uploadFileFileName.get(i) && uploadFileFileName.get(i).trim().length() > 0) {
ai = new ActivityImage();

String tempFileName = CommonUtils.reName(uploadFileFileName.get(i));
String dir = ServletActionContext.getServletContext().getRealPath("/upload/activity");
File dirs = new File(dir);
if (!dirs.exists()) {
dirs.mkdir();
}

String picturePath = dir + "/" + tempFileName;
File imageFile = new File(picturePath);
try {
//这里进行IO操作,拷贝文件流,你自己完成就行了

} catch (Exception e) {
e.printStackTrace();
}
}
}
}


javamylovett 2011-01-08
  • 打赏
  • 举报
回复
http://javamylovett.blog.163.com/blog/static/1734245692010118102735102/
写了一个小demo
magicluo 2011-01-08
  • 打赏
  • 举报
回复
js 肯定要做

js动态创建的上传file标签的所有name最好都一样,为区别说明,你可以加一个字段来命名。
后台action中使用数组或者list接收 循环处理.

前台注意js验证。

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧