Struts1文件上传与下载、Token防止重复提交、高级功能

1Struts文件上传与下载、Token防止重复提交、高级功能

1.1Struts的文件上传

使用SmartUpload时,保存文件需要通过saveAs方法来保存,但使用Struts文件上传时,需要通过自己定义的 IO操作来保存文件。接收文件类型参数也在ActionForm中完成,在ActionForm中需要使用FormFile类型的数据来接收。修改之前的教师添加功能。页面表单必须要封装。

文件域,使用html:file<input type=file>

<tr>

<td height="18" bgcolor="#FFFFFF" class="STYLE15">

<span class="STYLE19"><strong>教师照片:</strong>

</span>

</td>

<td bgcolor="#FFFFFF">

<span class="STYLE19"> <label>

<html:file property="photo"></html:file>

</label> </span>

</td>

</tr>

<html:form action="/pages/back/teacher.do" method="post" enctype="multipart/form-data">

不能直接将文件设置到lib对象的photourl。在ActionForm中接收这个photo参数,类型定义为FormFile

private FormFile photo ;

public FormFile getPhoto() {

return photo;

}

public void setPhoto(FormFile photo) {

this.photo = photo;

}

ActionForm中完成文件的上传操作。

public ActionErrors validate(ActionMapping mapping,

HttpServletRequest request) {

ActionErrors errors = new ActionErrors();

// 在进行验证时,先要判断当前的status状态,一般只有insertupdate才需要验证

if ("insert".equals(status)) {

if (teacher.getName() == null

|| teacher.getName().trim().equals("")) {

errors.add("teacher.name", new ActionMessage("name.null"));

}

// 验证通过的情况下要进行文件上传

if (errors.size() == 0) {

InputStream is = null;

FileOutputStream os = null;

try {

// 通过IO流操作来进行保存

is = photo.getInputStream();

// 可以使用两种方法取得物理路径

// this.getServlet().getServletContext().getRealPath();

String path = request.getSession().getServletContext()

.getRealPath("/upload")

+ "/";

// 主文件名使用时间戳生成

String fileName = IPTimeStamp.getIPTimeStamp(request

.getRemoteAddr());

// 扩展名,截取文件名的最后一个.后面的内容

fileName += photo.getFileName().substring(

photo.getFileName().lastIndexOf("."));

os = new FileOutputStream(new File(path + fileName));

// 边读边写

byte[] data = new byte[2048];

int length = 0;

while ((length = is.read(data)) != -1) {

os.write(data, 0, length);

}

// 将教师中的图片路径设置为fileName

teacher.setPhotourl(fileName);

} catch (FileNotFoundException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} finally {

if (is != null) {

try {

is.close();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

if (os != null) {

try {

os.close();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

}

}

return errors;

}

1.2Token防止重复提交

为了防止重复刷新,Struts提供了一个Token指令牌来进行处理。

其原理是在进入添加页前,在Session范围内保存一个属性(通过UUID生成),同时将这个值在进入添加页时自动保存在表单隐藏域中。当表单提交时,如果两个值相同,表示是第一次提交,允许进行添加操作,而且在添加完成后,将Session范围中的值重新生成。当用户刷新,并重复提交时,表单提交的那个隐藏域的值不变,但Session中的值改变了,比较这两个值,如果不一样,则表示用户进行了重复提交。 

修改library的添加,在进入添加页前的Action操作中,加入保存Session属性的方法。

public ActionForward insertpre(ActionMapping mapping, ActionForm form,

HttpServletRequest request, HttpServletResponse response) {

LibraryForm libraryForm = (LibraryForm) form;

Map map = BackServiceFactory.getLibrarySeviceInstance().insertper();

request.setAttribute("allItem", map.get("allItem"));// Session中保存一个属性

this.saveToken(request);

return mapping.findForward("insert");

}

页面表单自动生成隐藏域、修改添加部分的Action操作。调用Token的验证方法

public ActionForward insert(ActionMapping mapping, ActionForm form,

HttpServletRequest request, HttpServletResponse response) {

LibraryForm libraryForm = (LibraryForm) form;

if (this.isTokenValid(request)) {

boolean flag = BackServiceFactory.getLibrarySeviceInstance()

.doCreate(libraryForm.getLib());

<sp

分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

cnwuzhulin
  • 浏览: 18250 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

你可能感兴趣的:(html,struts,OS)