最近要实现一个上传技术,起初考虑使用struts1.2的html标签来实现上传功能,但是后来发现如果使用html标签那么在上传页面的布局,则不是那么灵活了! 后来放弃了这种思路,寻找使用传统标签来实现上传功能!
1。定义上传页面;
<form name="form1" action="/ss/upFileAction.do" target="" method="post" enctype="multipart/form-data">
<table class="table_info2" cellpadding="3" border="0.3" cellspacing="1">
<tr>
</tr>
<tr>
<td><input type="file" name="theFile" id="theFile" ></td>
</tr>
<tr>
<td><input type="text" id="descFile" value="" name="descFile">(文件描述)</td>
</tr>
<tr>
<td> <input type="checkbox" id="replace" name="replace" value="1">是否覆盖同名附件</td>
</tr>
<tr>
<td><input type="button" id="button" value="提交" onClick="upfile();"> <input type="button" value="取消" onClick="closeOpen();"></td>
</tr>
</table>
</form>
2。定义要使用的actionform,在其中使用file类型的字段,处理上传流!
ActionForm:
protected FormFile theFile;
3。后台处理传来的文件流,并保存到指定的服务器目录下;
public ActionForward upfile(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
ActionForward forward = null;
if (form instanceof UpFileForm) {// 如果form是UpLoadsForm
response.setContentType("text/html; charset=GBK");
UpFileForm theForm = (UpFileForm) form;
String replace = theForm.getReplace();
System.out.println("-=-=>"+theForm.getDescFile());
FormFile file = theForm.getTheFile();// 取得上传的文件
String contentType = file.getContentType();
String size = (file.getFileSize() + " bytes");// 文件大小
String fileName = file.getFileName();// 文件名
String area_code = request.getParameter("h_xian");
String yljg = request.getParameter("yljg");
String serverPath = request.getParameter("serverPath");
String desc = theForm.getDescFile();
try {
InputStream stream = file.getInputStream();// 把文件读入
//创建母文件夹
String folder_path = serverPath+"\\"+area_code+"\\"+yljg;
File folder_file =new File(folder_path);
if(!folder_file.exists()){
folder_file.mkdirs();
}
if(replace==null||"".equals(replace)){
if(getUpFileName(folder_path,fileName)){
request.setAttribute("S_ERROR_MSG", "对不起,上传的文件名重复,请重新命名!");
return mapping.findForward("error");
}
}
ByteArrayOutputStream baos = new ByteArrayOutputStream();
OutputStream bos = new FileOutputStream(folder_path + "\\"
+ fileName);
// 建立一个上传文件的输出流,将上传文件存入web应用的根目录。
int bytesRead = 0;
byte[] buffer = new byte[8192];
while ((bytesRead = stream.read(buffer, 0, 8192)) != -1) {
bos.write(buffer, 0, bytesRead);// 将文件写入服务器
}
bos.close();
stream.close();
} catch (Exception e) {
System.err.print(e);
e.printStackTrace();
request.setAttribute("S_ERROR_MSG", "对不起,附件上传失败!");
return mapping.findForward("error");
}
return mapping.findForward("input");
}
return null;
}
上传实现后,如果要实现下载功能,则思路是这样的:
只要获取该文件所在的http路径,然后写在a标签的href属性中,然后设定target属性值为a便可! 当我们点击该链接是,必可进入都该文件可! 我们可以对该链接右键进行目标另存为或者迅雷下载! 如果我们要下载的是doc文件或者excel文件,在点击链接后,便可弹出保存或者打开对话框! 也就是说访问web上的资源,是这样的情况! 如果路径为本地路径,访问本地资源,点击链接,则直接弹出保存对话框! 这是web访问和本地访问的不同方式!