想要进行文件的上传操作,首先要清楚文件上传的原理。在表单域中,有个enctype属性,它指定了表单数据的编码方式。enctype有3个值:
- application/x-www-form-urlencoded. 这是默认的编码方式,它用来处理表单域的value值,并将其处理为URL格式进行传递。
- multipart/form-data.这种编码方式会以二进制流的形式来处理表单数据。在进行文件上传时,需要将enctype属性设为此值。
- text/plain。适用于将表单数据以邮件的形式进行发送。
利用手动方式进行文件上传操作时,通常我们需要通过request对象来获得一个输入流,然后依次读取中的内容,并创建一个File对象,利用输出流写入,完成上传操作。
我们还可以利用一些框架来进行文件的上传操作,比较常用的有Common-FileUpload和COS,他们的工作原理是:通过分析HttpServletRequest的二进制流,解析出二进制流中包含的所有表单域,分析出每个表单域的类型(文件域或普通表单域),并允许开发者以简单的方式来取得文件域的内容字节、文件名、文件内容等信息,再利用IO流将文件内容写入服务器的任意位置,完成文件上传操作,也可以取得普通表单域的值。
Struts2并没有提供文件上传的解析器,但它封装了其他解析器,简化了文件上传操作。Struts2默认使用Jakarta Common-FileUpload框架进行上传,因此我们需要用到2个jar包:commons-io.jar和commons-fileupload.jar。Struts2也可以使用其他框架进行上传,但需要在struts.properties中修改struts.multipart.parser的值。
在Struts2中进行上传时,我们需要3个属性来封装文件域的值:
- File类型,名称为xxx,用于封装文件域对应的文件内容。
- String类型,名称为xxxFileName,用于封装文件域对应文件的文件名称。
- String类型,名称为xxxContentType,用于封装文件域对应文件的文件类型。
下面,我们以一个实例来进行说明:我们首先定义一个用于上传歌曲文件的表单: