写在前面
在cbs项目中进行软件升级包的上传保存,使用到了文件上传,这里简单讲一讲文件上传的实现过程以及使用中的一些问题
为了贴近实际使用,直接使用文件从页面上传到后台处理的步骤一步一步讲解。
页面
页面上表单中的选项框file
是文件上传的起点,在表单中input
选项框,type=”file”
,能够打开文件浏览器,浏览本地机器上的文件
<
input
type = "file" name= "packagefile">
表单发起上传文件请求有一个地方需要注意,就是在form
的属性里面必须使用enctype =“multipart/form-data”,
为什么呢?原因在于,enctype
属性指定将数据回发到服务器时,浏览器使用的编码类型,enctype
即EncodeType
的简写。表单数据默认的编码为”application/x-www-form-urlencoded”
,就是说,在发送到服务器之前,所有的字符都会进行编码(空格转换为”+”
加号,特殊符号转换为ASCII HEX
值),窗体数据被编码为名称/
值对,这是标准的编码格式,但是不能用于文件上传。enctype=”multipart/form-data”
是设置表单的MIME
(mutipurposeinternet mail extensions
多用途互联网邮件扩展类型,设定某种扩展名的文件用一种应用程序来打开的方式类型,具体参见http://baike.baidu.com/view/160611.htm?fr=aladdin
)编码,是指能够上传文件。
<
form
action="uploadaddVersion.action" method = "post" enctype="multipart/form-data">
后台
struts2
很好的对文件上传进行了封装,在接收上传文件时,创建和页面name
属性对应名称的File
对象就能够接收到上传至服务器的文件,至于上传的文件名获取,这里需要注意的是,必须创建的File
对象名+FileName
拼接而成,否则,原上传文件名是获取不到的。
/**Initial the file of upload */
private
File
packagefile;
/** The name of the upload file */
private
String
packagefileFileName
;
接收到文件之后的操作就简单了,对文件进行保存,保存到指定位置,如果保存地址不正确,进行文件删除等等。参见下面的File类方法整理。
这里详细说一下对文件进行另存的两种常用方法
1. 使用流将文件写到指定目录或者地址
- 创建输入流,读取上传的文件
InputStream is =
new FileInputStream(upload);
- 创建保存文件以及输出流
File toFile =
new File(uploadPath, fileName);
OutputStream os =
new FileOutputStream(toFile);
- 创建字节数据(定义每次读多少长度的内容)
byte[] buffer =
new byte[1024];
- 循环读取输入流中的文件并通过输出流写到保存文件中
while ((length =is.read(buffer)) > 0) {
os.write(buffer, 0,length);
}
- 关闭流
is.close();
os.close();
2. 使用FileUtils包对文件进行操作
FileUtils是对流操作的一次封装,封装之后对文件的操作更方便。常用功能包括复制文件,创建文件、删除文件等等,也可以对文件进行遍历,对文件获取字节数组,获取输入输出流等等,这里不就详细讲。
复制文件:
FileUtils.
copyFile(packagefile, sourcefile);
copyFile(srcFile, destFile)
srcFile , 源文件
destFile,目标文件
小细节:
在保存文件的时候避免不了要先创建文件,文件创建的方法有
3
种:
1.newFile(String filepath)
2.new File(File parent,String child)
3.new File(String parent, String child)
第一种filepath在实际使用中, 文件路径如果知道当然不会出错,但是多数情况是知道上传地址,然后需要使用地址拼接上传文件名获取上传文件的绝对路径,在拼接过程中由于系统异同,不好处理使用"\"还是"/",故不推荐使用
第二种和第三种类似,一种是使用父文件,一种是使用父文件路径,两种都可以直接获取,相对第一种会简洁许多。
至此,对上传文件的操作已经完成。