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)方法同上
思想:图片是以流的方式进行读取,上传的图片存放在服务器端的某个文件夹中,数据库中保存的是上传的图片的地址。
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)方法同上