xiaolutan
年轻没有失败成功是需要积累的
Struts实现单文件上传、修改、删除(以图片为例)
一、文件上传
思想:图片是以流的方式进行读取,上传的图片存放在服务器端的某个文件夹中,数据库中保存的是上传的图片的地址。
1
.ActionForm(userForm)
private
FormFile image;
//
用于封装从jsp页面传过来的文本类型的属性
2
.pojo(User)
private
String path;
//
用于存放上传图片的地址,数据库中需要添加存放该地址的字段
3
.jsp
<
html:form action
=
"
"
enctype
=
"
multipart/form-data
"
>
//
form设置了enctype属性后就是二进制传输数据了
<
html:file property
=
"
image
"
></
html:file
>
</
html:form
>
4
.action
String basePath
=
this
.getServlet().getServletContext().getRealPath(
"
/
"
);
//
获得服务器的基路径
String path
=
"
/uploadImage/
"
+
userService.picturePath(userForm.getImage());
//
上传图片保存的相对路径,图片 名通过userService中的picturePath方法进行处理
String endString
=
userForm.getImage().getFileName().substring
(userForm.getImage().getFileName().lastIndexOf(
"
.
"
)
+
1
);
//
获取图片的后缀名
5
.service(userService)
if
(
"
jpg
"
.equals(endString)
||
"
png
"
.equals(endString)
||
"
gif
"
.equals(endString)
||
"
JPG
"
.equals(endString)
||
"
PNG
"
.equals(endString)
||
"
GIF
"
.equals(endString))
{
//
限制上传图片的类型
userDAO.saveImage(image,basePath,path);
//
保存图片
user.setPath(path);
//
将上传图片的路径(地址)进库
}
else
{
user.setPath(
"
"
);
//
上传的图片不符合要求,在数据库中设置为空
}
6
.dao(userDAO)
public
String picturePath(FormFile image)
{
//
处理上传的图片名,UUIDGenerator详见相关日志
String filename
=
"
"
;
//
初始化变量
UUIDGenerator g
=
new
UUIDGenerator();
//
创建UUIDGenerator类的一个对象
filename
=
image.getFileName();
//
将图片的文件名赋值给变量
if
(filename.length()
>
0
)
{
filename
=
filename.substring(filename.lastIndexOf(
"
.
"
));
//
将文件名除了后缀名的部分赋给filename变量
}
filename
=
(String)g.generate()
+
filename;
//
对上传的图片文件名进行处理,以免出现上传的图片名相同
return
filename;
}
public
void
saveImage(FormFile image,String basePath,String path)
throws
IOException
{
//
上传图片
FileOutputStream fos
=
null
;
//
文件输出流
BufferedInputStream in
=
null
;
//
缓冲的输入流
BufferedOutputStream out
=
null
;
//
缓冲的输出流
try
{
fos
=
new
FileOutputStream(basePath
+
path);
//
创建一个向指定File对象表示的文件中写入数据的输出流
in
=
new
BufferedInputStream(image.getInputStream());
//
创建BufferedInputStream并保存其参数,即输入流 in,以便将来使用
out
=
new
BufferedOutputStream(fos);
//
创建一个新的缓冲输出流,以将数据写入指定的基础输出流
byte
[] buf
=
new
byte
[
8192
];
//
创建一个字节缓冲数组,用于指定每次写入的字节大小(8192=8k)
int
readSize;
while
((readSize
=
in.read(buf))
!=-
1
)
{
//
判断缓冲数组中是否还有数据
out.write(buf,
0
, readSize);
//
将指定buf数组中从偏移量0开始的readSize个字节写入此缓冲的输出流
out.flush();
//
关闭缓冲的输出流
}
}
catch
(FileNotFoundException e)
{
//
TODO Auto-generated catch block
e.printStackTrace();
}
finally
{
if
(out
!=
null
)
{
try
{
out.close();
}
catch
(RuntimeException e)
{
//
TODO Auto-generated catch block
e.printStackTrace();
}
}
if
(in
!=
null
)
{
try
{
in.close();
}
catch
(RuntimeException e)
{
//
TODO Auto-generated catch block
e.printStackTrace();
}
}
if
(fos
!=
null
)
{
try
{
fos.close();
}
catch
(RuntimeException e)
{
//
TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
二、文件删除
思路:上传的文件存放在某个文件夹中,该图片的地址存放在数据库中,因此,在删除图片的时候,不仅要删除它在数据库中的地址,而且还要删除在文件夹中的文件,删除图片之前要获取该图片的绝对路径。
1
.action(userAction)
String basepath
=
this
.getServlet().getServletContext().getRealPath(
"
/
"
);
//
获得服务器基路径
2
.service(userService)
userDAO.deleteImage(uId,basepath);
//
删除图片
userDAO.deleteUser(uId);
//
删除图片在数据库中的路径
3
.dao(userDAO)
public
void
deleteImage(Integer uId,String basepath)
{
User user
=
this
.getUserById(uId);
//
取出某个用户对象(获得图片的相对路径)
String path
=
user.getPath();
//
将图片的相对路径赋值
if
(path
!=
null
)
{
File file
=
new
File(basepath
+
path);
//
根据绝对路径创建一个文件对象
file.delete();
//
删除文件
}
}
三、修改文件
思路:先将原来的图片删除,然后重新上传一张图片
1
.jsp(edit.jsp)
<
html:hidden property
=
"
path
"
/>
//
获得原来图片的路径放在隐藏域中(尤其要注意)
<
html:file property
=
"
image
"
/>
2
.action(userAction)
String basepath
=
this
.getServlet().getServletCotext().getRealPath(
"
/
"
);
//
获得服务器基路径
String path
=
null
;
if
(userForm.getImage().getFileSize()
>
0
)
{
//
判断是否需要修改图片
path
=
"
/uploadImage/
"
+
userForm.getImage();
}
userService.modify(basepath,path,userForm.getImage());
//
调用修改的方法
3
.service(userService)
if
(user.getPath()
!=
null
&&
path
!=
null
)
{
//
需要修改图片的情况
userDAO.deleteImage(basepath
+
path);
//
根据绝对路径删除图片
userDAO.saveImage(image,basepath,path);
//
根据相对路径重新上传一张图片
user.setPath(path);
//
将新路径保存到user对象中
}
userDAO.modify(id,user);
4
.dao(userDAO)方法同上
posted on 2012-01-07 16:27
巨石
阅读(1262)
评论(0)
编辑
收藏
新用户注册
刷新评论列表
只有注册用户
登录
后才能发表评论。
网站导航:
博客园
IT新闻
知识库
C++博客
博问
管理
Powered by:
BlogJava
Copyright © 巨石
<
2012年1月
>
日
一
二
三
四
五
六
25
26
27
28
29
30
31
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
1
2
3
4
导航
BlogJava
首页
新随笔
联系
聚合
管理
统计
随笔 - 1
文章 - 0
评论 - 0
引用 - 0
常用链接
我的随笔
我的评论
我的参与
留言簿
给我留言
查看公开留言
查看私人留言
随笔档案
2012年1月 (1)
搜索
最新评论