天天看点

文件上传--Smartupload上传组件【中】

表单封装问题

在smartupload上传组件【上】中我们学习了smartupload上传的应用,但是我们说那个程序有一点问题,什么问题呢?我们已经知道了要进行文件上传,则肯定要对表单进行封装,问题就在表单封装这里,表单一旦封装之后,就无法使用request.getparameter()来接受参数了。例如:在表单中定义了姓名等变量,在.jsp中就不能用request.getparameter()来接受这个名字了。一个例子看一下到底怎么不能接受。

有了.html页了 再来做.jsp页面用来接受图片和姓名

在smart_02.jsp中用了request.getparameter()来接受参数,但是运行一下(如下图):结果为null  是一个空值。

文件上传--Smartupload上传组件【中】

也就是说根本就无法接受参数,而且使用getparametervalues()也无法接受,因为在smart_02.html中,姓名属性随着表单被封装了,所有的数据不再是文本了,而是二进制byte流了,那么这个时候要想接受参数就必须使用smartload中提供的方法支持。

这个时候在运行一下,结果就能正常显示了,但是又有一个新的问题出现了,细心的读者就会发现,如果两次都上传同一张图片,那么在upload文件夹中只是存在了一张图片,也就是说第二次上传的图片覆盖了第一张,它是 一个覆盖的过程,但是我们希望两张一样的图片都能上传,并且让他们的名字不一样那该怎么办?

为上传文件自动命名功能

大家应该都有过这样的经历:在网上下载一张图片,点击右键图片另存为,接着会弹出图片保存的路径的对话框(如下图),红色区域的名字为一串看不懂的字符,那个字符就是系统为图片自动命名的,而我们所要实现的就是为上传的图片自动分配名字。

文件上传--Smartupload上传组件【中】

关于自动命名功能的实现原理

    如果多个用户上传的文件名称一样,则肯定会发生覆盖的情况,为了解决这种问题,可以采用为上传文件自动命名的方式,为了防止重名,自动命名可以采用如下格式:

       1.  ip地址+时间戳+三位随机数

        2. 例如:现在连接的ip地址为192.168.12.19,日期时间是:2013-03-02 17:58:12,三位随机数为678,则拼凑出的新文件名称就是19216801201920130302125812678.文件后缀名

为了进行文件后缀的拼凑,我们建立一个专门用于此种操作的类---iptimestamp,此类作为一个javabean,在simple包下创建。

将smart_02.jsp改成如下:

我们来运行一下,写上我的名字:赵玉强,然后上传一张名字为dahai.jpg的图片,结果如下:

文件上传--Smartupload上传组件【中】

可以看见图片和名字都能够正常显示,我们在来看一下upload文件中是否上传上了图片呢?而且图片的名字是否是系统自动命名的呢?打开tomcat/webapps下的项目找到upload文件夹。图片确实有了,如下图所示:

文件上传--Smartupload上传组件【中】

 可以发现上传的图片的名字不是上传之前的名字了,而是系统自动上传的名字,而且不管对同一张图片上传多少次,都不会出现只有一张的情况了,因为系统会自动分配给上传图片不同的名字。

继续阅读