NutzCN Logo
问答 form表单上传多个文件,文件名不同,能不能用一个对象接收
发布于 1929天前 作者 hcxxiaomo 1992 次浏览 复制 上一个帖子 下一个帖子
标签:

根据这个 http://www.nutzam.com/core/mvc/http_adaptor.html 前缀表单方式,上传数据。其中,每个List<>里面的对象都有一个对应的图片,对象是这样的。

public class MonitorRoad{
	
	private Long id;

	private String road;

    private Integer distance;
	
    private TempFile imgPath;
	
	}

imgPath 会报String不能转成 TempFile

这个MonitorRoad对象会有多个,每个都有一个图片,必须一一对应,而且图片是一起form上传提交的,所以 对应的name是 mp.list["+row_count+"].imgPath ,这样的话,用@Param("pic") 不能收到数据,因为 row_count是从1增加到N的,请问这样要怎么才能比较方便地接收图片呢?

12 回复

入口方法写了什么

@Param("::mp.")MonitorPosition mrList
里面有一个 List 对象

前端 上传的数据,是这样的

<table>
				</thead>
				<tbody>
				<tr><td>1<input type="text" name="mp.list[1].id" id="mp.list[1].id" value="" hidden="hidden"></td>
				<td><input type="text" name="mp.list[1].road" id="mp.list[1].road" value=""></td>
				<td><input type="text" name="mp.list[1].distance" id="mp.list[1].distance" value=""></td>
				<td><input type="file" name="mp.list[1].imgFile" id="mp.list[1].imgpath"></td><td><a href="javascript:delRow(1)">删除</a></td>
				
				</tr>
				
				<tr>
				<td>2<input type="text" name="mp.list[2].id" id="mp.list[2].id" value="" hidden="hidden"></td>
				<td><input type="text" name="mp.list[2].road" id="mp.list[2].road" value=""></td>
				<td><input type="text" name="mp.list[2].distance" id="mp.list[2].distance" value=""></td>
				<td><input type="file" name="mp.list[2].imgFile" id="mp.list[2].imgpath"></td>
				<td><a href="javascript:delRow(2)">删除</a></td></tr>
				
				<tr><td>3<input type="text" name="mp.list[3].id" id="mp.list[3].id" value="" hidden="hidden"></td>
				<td><input type="text" name="mp.list[3].road" id="mp.list[3].road" value=""></td>
				<td><input type="text" name="mp.list[3].distance" id="mp.list[3].distance" value=""></td>
				<td><input type="file" name="mp.list[3].imgFile" id="mp.list[3].imgpath"></td>
				<td><a href="javascript:delRow(3)">删除</a></td></tr>
				
				<tr><td>4<input type="text" name="mp.list[4].id" id="mp.list[4].id" value="" hidden="hidden"></td>
				<td><input type="text" name="mp.list[4].road" id="mp.list[4].road" value=""></td>
				<td><input type="text" name="mp.list[4].distance" id="mp.list[4].distance" value=""></td>
				<td><input type="file" name="mp.list[4].imgFile" id="mp.list[4].imgpath"></td>
				<td><a href="javascript:delRow(4)">删除</a></td></tr>
				
				</tbody>
			</table>

ajax 上传文件?

form表单上传多个图片图片,但是每个图片的name是不同的。看了下代码,好像是 ObjectNavlPairInjector 会把TempFile对象转换成String。

ajax上传文件的话, 需要额外的js库, 不然会当成普通表单提交的

不是ajax上传文件,是form表彰提交的。后台能收到数据,只是把TempFile转成String了。

{id=, lat=22.580052, lng=113.952394, name=测试, monitorType=电警枪机, mp.list[1].id=, mp.list[1].road=测试路段信息, mp.list[1].distance=100, mp.list[1].imgFile=org.nutz.mvc.upload.TempFile@50e7748f, mp.list[2].id=, mp.list[2].road=111, mp.list[2].distance=111, mp.list[2].imgFile=org.nutz.mvc.upload.TempFile@7868803d}

额, ObjectNavlPairInjector, 有可能

是最新版吗?

org.nutz.mvc.adaptor.extractor.MapParamExtractor中的extractor方法

public String[] extractor(String name) {
        if (null != map && map.containsKey(name)) {
            Object obj = map.get(name);
            if (obj instanceof String[])
                return (String[]) obj;
            if (obj == null)
                return null;
            return new String[]{obj.toString()};
        }
        if (req == null)
            return null;
        return req.getParameterValues(name);
    }

其中map是

{id=, lat=, lng=, name=测试, monitorType=, mp.list[1].id=, mp.list[1].road=测试路段信息, mp.list[1].distance=100, mp.list[1].imgFile=org.nutz.mvc.upload.TempFile@7b343f99, mp.list[2].id=, mp.list[2].road=111, mp.list[2].distance=111, mp.list[2].imgFile=org.nutz.mvc.upload.TempFile@7de414ed}

当name= "mp.list[1].imgFile" 的时候,Object obj = map.get(name); 得到的是一个 TempFile,最后直接转成了 return new String[]{obj.toString()}; 把TempFile对象转换成了String。
现在用的是1.r.62版本,我更新到最新的,再看看这个 org.nutz.mvc.adaptor.extractor.MapParamExtractor 中是否对TempFile有特殊处理

org.nutz.mvc.adaptor.injector.ObjectNaviNode
好像只支持String对象呢,会把所有的都转成String[]

例:
Object: node.str = str
list: node.list[1].str = abc;
node.list:2.str = 2
set: node.set[2].str = bbb
node.set:jk.str = jk
Map: node.map(key).str = bb;
node.map.key.name = map


 //节点名
    private String name;
    //叶子节点的值
    private String[] value;

这就有点蛋疼了...

要不临时解决一下, 先把属性改成Object, 然后再加一个参数 @Params("..")NutMap params 拿到全部TempFile, 然后设置一下...

可以,谢谢!先这样处理没问题。明天我再看看代码怎样改,可以支持TempFile。

添加回复
请先登陆
回到顶部