文件的上传下载
1文件上传下载基本原理:
在一个Web工程中,要实现文件的上传,首先要把表单上传数据的编码方式设置为二进制数据格式,这要用到表单的enctype属性,此属性一般有三个值。
1.1
application/x-www-form-urlencoded:这是默认值,适用范围最广泛。但在向服务器发送大量的文本、包含非ASCII字符的文本或二进制数据时,这种编码方式效率很低。
1.2
multipart/form-data:上传二进制数据,只有使用了multipart/form-data才能完整上传数据,完成上传功能。
1.3
text/plain:主要用于电子邮件的应用。
一般实际应用中多设置enctype属性值为multipart/form-data,这样在服务器中得到的上传数据才能以二进制传递。然后设置一个输入流,得到页面上传来的文件信息,再用一个输出流将这个文件写入服务器的内存中。部分代码改自三扬科技,开发者突击:Struts2核心技术与JavaEE框架整合开发实战一书。
2.应用详解:
FileAction.java
实现功能的代码段:
//
用列表封装上传文件的三个属性
,
若只上传一个文件的情况,可以不用列表。
private
List<File>
upload
;
private
List<String>
uploadContentType
;
private
List<String>
uploadFileName
;
// savePath,fileName
为数据库中的对应项
private
String
savePath
;
private
String
fileName
;
private
File
file
;
public
String addSave()
throws
Exception {
System.
out
.println(
"-------fileaddsave"
);
//
将页面上传的文件封装成一个列表
List<File> files = getUpload();
//
设置上传文件存放的相对路径
setSavePath(
""
);
String path =
"D:/project/file/"
;
//
保存上传文件路径
File f =
new
File(path);
//
判断文件夹是否存在,不存在,则创建一个新文件夹
try
{
if
(!f.isDirectory()) {
f.mkdir();
}
//
遍历删除所有该文件夹下的文件
File[] flist = f.listFiles();
for
(
int
i = 0; i < flist.
length
; i++) {
flist[i].delete();
}
}
catch
(Exception ex) {
ex.printStackTrace();
}
//
用一个
for
循环把
files
中的所有文件取出来逐一上传
if
(files !=
null
) {
for
(
int
i = 0; i < files.size(); i++) {
//
以上传文件存放路径和原文件名建立一个输出流
path+ System.currentTimeMillis()+
// fileName.substring(fileName.lastIndexOf("."),fileName.length())
String filename = getUploadFileName().get(i);
System.
out
.println(filename);
FileOutputStream fos;
getRequest().getSession().setAttribute(
"fileName"
, filename);
// if explore is ie
if
(filename.indexOf(
"/"
) == -1) {
fos =
new
FileOutputStream(path + filename);
}
else
{
// if explore is firefox
String fileNAME = filename.substring(filename
.lastIndexOf(
"/"
), filename.length());
fos =
new
FileOutputStream(path + fileNAME);
}
System.
out
.println(getUploadFileName().get(i));
//
以上传文件建立一个输入流
FileInputStream fis =
new
FileInputStream((File) files.get(i));
//
将上传文件写入到输出流所对应的文件中
byte
[] buffer =
new
byte
[1024];
int
len = 0;
while
((len = fis.read(buffer)) > 0) {
fos.write(buffer, 0, len);
}
fos.close();
}
}
String fileName = (String) getRequest().getSession().getAttribute(
"fileName"
);
file
.setSavePath(path);
file
.setFileName(fileName);
fileDAO
.attachDirty(
file
);
return
SUCCESS
;
}
public
String download()
throws
Exception {
Integer id = (Integer) getRequest().getSession().getAttribute(
"id"
);
file
= (File)
fileDAO
.findByProperty(
"id"
, id)
.get(0);
String path =
file
.getSavePath();
String name =
file
.getFileName();
File f =
new
File(path);
if
(f.exists()) {
try
{
getResponse().setContentType(
"application/octec-stream"
);
getResponse().setHeader(
"Content-Disposition"
,
"attachment;filename="
+
new
String(name.getBytes(),
"ISO-8859-1"
));
OutputStream outputStream = getResponse().getOutputStream();
InputStream inputStream =
new
FileInputStream(path);
byte
[] buffer =
new
byte
[1024];
int
i = -1;
while
((i = inputStream.read(buffer)) != -1) {
outputStream.write(buffer, 0, i);
}
outputStream.flush();
outputStream.close();
inputStream.close();
outputStream =
null
;
}
catch
(Exception e) {
e.printStackTrace();
}
}
return
null
;
}
本文转自 gaochaojs 51CTO博客,原文链接:http://blog.51cto.com/jncumter/163457,如需转载请自行联系原作者