在struts里面,用的上传也是apache fileupload包,不过它把这个包的方法又进行了一次封装,得采用struts里面的org.apache.struts.upload.FormFile类来实现上传,如果用传统的方法的,DiskFileUpload fu = new DiskFileUpload();fu.parseRequest(request)这个地方就取不到JSP页面里的input类型的file的值,在网上查了下,好像是struts将这个给屏蔽了,也就是说得要用struts的方式进行上传.
JSP页面:
- <html:form action="/kybasicAttachment.do?action=fileUpload&attTFileTable=${kybasicAttachmentForm.attTFileTable}&type=${param.type }&infoId=${param.infoId }" enctype="multipart/form-data">
- <table width="100%" border="0">
- <tr>
- <td><b>文件:<html:file property="theFile"/></b></td>
- </tr>
- <tr>
- <td><input class="button" type="submit" value="附加文件">
- <input class="button" type="button" onclick="window.close();" value="关闭"></td>
- </tr>
- </table>
- </html:form>
生成随机数的方法
RandomName类:
- package kymanage.kybasic.common;
- import java.text.SimpleDateFormat;
- import java.util.Calendar;
- /**
- *
- * @author coffee
- *
- */
- public class RandomName {
- /**
- * 生成随机数
- *
- * @param sLen
- * @return String
- * 调用方法:String autoName = RandomName.ConfirmId(15),参数15为随机生成字符的长度
- */
- public static String randomKey(int sLen) {
- String base;
- String temp;
- int i;
- int p;
- base = "1234567890";
- temp = "";
- for (i = 1; i < sLen; i++) {
- p = (int) (Math.random() * 10);
- temp += base.substring(p, p + 1);
- }
- return (temp);
- }
- /**
- * 生成随机号
- *
- * @param sLen
- * @return String
- */
- public static String ConfirmId(int sLen) {
- String base;
- String temp;
- int i;
- int p;
- String date=new SimpleDateFormat("yyyyMMddHHmmss").format(Calendar.getInstance().getTime());
- base = "1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ";
- temp = "";
- for (i = 0; i < sLen; i++) {
- p = (int) (Math.random() * 37);
- if (p > 35)
- p = 35;
- temp += base.substring(p, p + 1);
- }
- return (date+temp);
- }
- public static void main(String[] args) {
- /*
- * java.util.Random r = new java.util.Random();//不带种子 //java.util.Random
- * r = new java.util.Random(10);//带种子 for (int i = 0; i < 10; i++) {
- * System.out.println(r.nextInt()); }
- */
- //RandomName test = new RandomName();
- //System.out.println(test.ConfirmId(15));
- }
- }
- package kymanage.kybasic.form;
- import java.util.ArrayList;
- import java.util.List;
- import javax.servlet.http.HttpServletRequest;
- import org.apache.struts.action.ActionErrors;
- import org.apache.struts.action.ActionForm;
- import org.apache.struts.action.ActionMapping;
- import org.apache.struts.upload.FormFile;
- /**
- *
- * @author coffee
- *
- */
- public class KybasicAttachmentForm extends ActionForm {
- // 附件表
- private String attId;
- private String attFId;
- private String attName;
- private String attUrl;
- private String attFormat;
- private String attSize;
- private String attFileTable;
- private String attStandby1;
- private String attStandby2;
- private String attStandby3;
- private String attStandby4;
- private String attStandby5;
- private String attStandby6;
- private List list;
- private List fileList;
- //上传文件
- private FormFile theFile;//form表单里input对应的file类型的名字
- public ActionErrors validate(ActionMapping mapping,
- HttpServletRequest request) {
- return null;
- }
- public void reset(ActionMapping mapping, HttpServletRequest request) {
- }
- public String getAttId() {
- return attId;
- }
- public void setAttId(String attId) {
- this.attId = attId;
- }
- public String getAttFId() {
- return attFId;
- }
- public void setAttFId(String attFId) {
- this.attFId = attFId;
- }
- //其它getter和setter方法.....................
- public FormFile getTheFile() {
- return theFile;
- }
- public void setTheFile(FormFile theFile) {
- this.theFile = theFile;
- }
- public List getFileList() {
- return fileList;
- }
- public void setFileList(List fileList) {
- this.fileList = fileList;
- }
- }
Action类:
- package kymanage.kybasic.action;
- import java.io.File;
- import java.io.FileOutputStream;
- import java.io.IOException;
- import java.io.InputStream;
- import java.io.OutputStream;
- import java.io.PrintWriter;
- import java.text.SimpleDateFormat;
- import java.util.ArrayList;
- import java.util.Calendar;
- import java.util.Date;
- import java.util.Iterator;
- import java.util.List;
- import javax.servlet.ServletException;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- import javax.servlet.http.HttpSession;
- import org.apache.struts.action.ActionForm;
- import org.apache.struts.action.ActionForward;
- import org.apache.struts.action.ActionMapping;
- import org.apache.struts.upload.FormFile;
- import kymanage.kybasic.basicaction.KybasicBasicAction;
- import kymanage.kybasic.common.RandomName;
- import kymanage.kybasic.form.KybasicAttachmentForm;
- /**
- *
- * @author coffee
- *
- */
- public class KybasicAttachmentAction extends KybasicBasicAction {
- /**
- * 附件上传操作
- * @param mapping
- * @param form
- * @param request
- * @param response
- * @return
- * @throws ServletException
- * @throws IOException
- */
- public ActionForward fileUpload(ActionMapping mapping, ActionForm form,
- HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
- String type=request.getParameter("type");
- String infoIdStr=request.getParameter("infoId");
- Long infoId=(long)0;
- if(infoIdStr!=null && !infoIdStr.equals("")){
- infoId=Long.parseLong(infoIdStr);
- }
- KybasicAttachmentForm kybasicAttachmentForm = (KybasicAttachmentForm) form;
- String attTFileTable=request.getParameter("attTFileTable");
- String path = request.getContextPath();
- request.setCharacterEncoding("GBK");// 必须写在PrintWriter前面,否则乱码显示
- response.setContentType("text/html;charset=GBK");// 必须写在PrintWriter前面,否则乱码显示
- PrintWriter out = response.getWriter();
- //设置目录,此处目录是按'年/年-月/年-月-日/'这样的目录来放置,文件名采用随机生成的.
- String parentDirName = "upload";
- String secondDirName = attTFileTable;
- String thirdDirName = new SimpleDateFormat("yyyy").format(Calendar.getInstance().getTime());
- String forthDirName = new SimpleDateFormat("yyyy-MM").format(Calendar.getInstance().getTime());
- String fifthDirName = new SimpleDateFormat("yyyy-MM-dd").format(Calendar.getInstance().getTime());
- String parentDir = this.servlet.getServletContext().getRealPath("/"+parentDirName);
- String secondDir = this.servlet.getServletContext().getRealPath("/"+parentDirName+"/"+secondDirName);
- String thirdDir = this.servlet.getServletContext().getRealPath("/"+parentDirName+"/"+secondDirName+"/"+thirdDirName);
- String forthDir = this.servlet.getServletContext().getRealPath("/"+parentDirName+"/"+secondDirName+"/"+thirdDirName+"/"+forthDirName);
- String dir = this.servlet.getServletContext().getRealPath("/"+parentDirName+"/"+secondDirName+"/"+thirdDirName+"/"+forthDirName+"/"+fifthDirName);
- if (parentDir == null || secondDir == null || dir == null) {
- out.print("无法访问存储目录!");
- }
- File fRootDir = new File(parentDir);
- if (!fRootDir.exists()) {
- if (!fRootDir.mkdir()) {
- out.println("无法创建存储目录!");
- }
- }
- File fSecondDir = new File(secondDir);
- if (!fSecondDir.exists()) {
- if (!fSecondDir.mkdir()) {
- out.println("无法创建存储目录!");
- }
- }
- File fThirdDir = new File(thirdDir);
- if (!fThirdDir.exists()) {
- if (!fThirdDir.mkdir()) {
- out.println("无法创建存储目录!");
- }
- }
- File fForthDir = new File(forthDir);
- if (!fForthDir.exists()) {
- if (!fForthDir.mkdir()) {
- out.println("无法创建存储目录!");
- }
- }
- File fUploadDir = new File(dir);
- if (!fUploadDir.exists()) {
- if (!fUploadDir.mkdir()) {
- out.println("无法创建存储目录!");
- }
- }
- List<String> list = new ArrayList<String>();// 注意文件类型最好全部用小写,此处设置的为不允许上传的类型
- list.add("exe");
- list.add("com");
- list.add("dll");
- list.add("java");
- list.add("class");
- list.add("jsp");
- list.add("js");
- list.add("html");
- list.add("htm");
- list.add("ini");
- list.add("inf");
- if (!dir.endsWith("/")) {
- dir = dir.concat("/");
- }
- FormFile file = kybasicAttachmentForm.getTheFile();
- if (file == null || (file != null && file.getFileSize()==0)) {//判断上传数据是否为空
- out.println("<html><head><title>附件上传</title></head>");
- out.println("<body bgcolor=/"#EFF9FC/">");
- out.println("<p align=/"center/"");
- out.println("<br><br>");
- out.println("上传文件数据不能为空!<br><br>");
- out.println("<a href=" + path
- + "/kybasicAttachment.do?action=fileUploadList&attTFileTable="+attTFileTable+"&type="+type+"&infoId="+infoId
- + "><font color=#3300FF>返回上一页</font></a>");
- out.println("</p>");
- out.println("</body></html>");
- return mapping.getInputForward();
- }
- String fname = file.getFileName();// 获取文件名
- String ext = fname.substring(fname.lastIndexOf(".") + 1, fname.length());
- // 获取文件类型,即扩展名,通过String类的substring方法截取字符串,lastIndexOf获取某个字符串最后出现的索引。
- ext = ext.toLowerCase();// 全部转换成小写。
- if (list.contains(ext)) {// 判断该类型是否为允许上传的文件类型
- out.println("<html><head><title>附件上传</title></head>");
- out.println("<body bgcolor=/"#EFF9FC/">");
- out.println("<p align=/"center/"");
- out.println("<br><br>");
- out.println("不支持该文件类型上传,该文件类型是:" + ext + "<br><br>");
- out.println("<a href=" + path
- + "/kybasicAttachment.do?action=fileUploadList&attTFileTable="+attTFileTable+"&type="+type+"&infoId="+infoId
- + "><font color=#3300FF>返回上一页</font></a>");
- out.println("</p>");
- out.println("</body></html>");
- return mapping.getInputForward();
- }
- int fsize = file.getFileSize();// 获取文件大小
- if (fsize > 1024 * 1024 * 20) {// 判断文件大小是否为允许上传的大小。
- out.println("<html><head><title>附件上传</title></head>");
- out.println("<body bgcolor=/"#EFF9FC/">");
- out.println("<p align=/"center/"");
- out.println("<br><br>");
- out.println("上传文件太大,最大支持20M上传<br><br>");
- out.println("<a href=" + path
- + "/kybasicAttachment.do?action=fileUploadList&attTFileTable="+attTFileTable+"&type="+type+"&infoId="+infoId
- + "><font color=#3300FF>返回上一页</font></a>");
- out.println("</p>");
- out.println("</body></html>");
- return mapping.getInputForward();
- }
- InputStream in = null;// 输入流用来读取用户上传文件
- OutputStream outputStream = null;// 用来将用户上传文件存出在服务器特定目录中。
- try {
- in = file.getInputStream();
- String autoName= RandomName.ConfirmId(15) + "." + ext;//RandomName.ConfirmId()这个方法是自己随机生成文件名方法
- outputStream = new FileOutputStream(dir + autoName);
- int byteread = 0;
- byte[] bytes = new byte[8192];
- while ((byteread = in.read(bytes, 0, 8192)) != -1) {
- outputStream.write(bytes, 0, byteread);
- }
- String attTName=fname;//附件原名称
- String attTRealName=autoName;
- String attTUrl="/"+secondDirName+"/"+thirdDirName+"/"+forthDirName+"/"+fifthDirName+"/";//附件实际地址
- String attTFormat=ext.toUpperCase();//附件格式
- HttpSession session=request.getSession();
- String userSno = (String)session.getAttribute("userSNo");
- Long attTSize=(long)fsize;
- String attTStandby1="";
- String attTStandby2="";
- String attTStandby3="";
- Long attTStandby4=(long)0;
- Long attTStandby5=(long)0;
- Long attTStandby6=(long)0;
- //将附件信息新增到数据库中
- kybasicAttachmentTmpService.save(attTName, attTRealName, attTUrl, attTFormat, attTSize, attTFileTable, userSno, attTStandby1, attTStandby2, attTStandby3, attTStandby4, attTStandby5, attTStandby6);
- } catch (Exception e) {
- out.println("<html><head><title>附件上传</title></head>");
- out.println("<body bgcolor=/"#EFF9FC/">");
- out.println("<p align=/"center/"");
- out.println("<br><br>");
- out.println("由于网络和服务器问题,上传实败<br><br>");
- out.println("<a href=" + path
- + "/kybasicAttachment.do?action=fileUploadList&attTFileTable="+attTFileTable+"&type="+type+"&infoId="+infoId
- + "><font color=#3300FF>返回上一页</font></a>");
- out.println("</p>");
- out.println("</body></html>");
- return mapping.getInputForward();
- } finally {
- try {
- in.close();
- outputStream.close();
- } catch (Exception e) {
- return mapping.getInputForward();
- }
- }
- ActionForward forward=mapping.findForward("file_upload");
- ActionForward newForward=new ActionForward();
- String newPath=forward.getPath() +"&attTFileTable="+attTFileTable+"&type="+type+"&infoId="+infoId;
- newForward.setPath(newPath);
- return newForward;
- }
- }