Struts上传方法

在struts里面,用的上传也是apache fileupload包,不过它把这个包的方法又进行了一次封装,得采用struts里面的org.apache.struts.upload.FormFile类来实现上传,如果用传统的方法的,DiskFileUpload fu = new DiskFileUpload();fu.parseRequest(request)这个地方就取不到JSP页面里的input类型的file的值,在网上查了下,好像是struts将这个给屏蔽了,也就是说得要用struts的方式进行上传.

JSP页面:

  1. <html:form action="/kybasicAttachment.do?action=fileUpload&attTFileTable=${kybasicAttachmentForm.attTFileTable}&type=${param.type }&infoId=${param.infoId }" enctype="multipart/form-data">
  2. <table width="100%" border="0">
  3. <tr>
  4.    <td><b>文件:<html:file property="theFile"/></b></td>
  5.     </tr>
  6.     <tr>
  7.    <td><input class="button" type="submit" value="附加文件">
  8.     <input class="button" type="button" onclick="window.close();" value="关闭"></td>
  9.     </tr>
  10. </table>
  11. </html:form>

生成随机数的方法

RandomName类:

  1. package kymanage.kybasic.common;
  2. import java.text.SimpleDateFormat;
  3. import java.util.Calendar;
  4. /**
  5. * @author coffee
  6. *
  7. */
  8. public class RandomName {
  9. /**
  10. * 生成随机数
  11. * @param sLen
  12. * @return String
  13. * 调用方法:String autoName = RandomName.ConfirmId(15),参数15为随机生成字符的长度
  14. */
  15. public static String randomKey(int sLen) {
  16.    String base;
  17.    String temp;
  18.    int i;
  19.    int p;
  20.    base = "1234567890";
  21.    temp = "";
  22.    for (i = 1; i < sLen; i++) {
  23.     p = (int) (Math.random() * 10);
  24.     temp += base.substring(p, p + 1);
  25.    }
  26.    return (temp);
  27. }
  28. /**
  29. * 生成随机号
  30. * @param sLen
  31. * @return String
  32. */
  33. public static String ConfirmId(int sLen) {
  34.    String base;
  35.    String temp;
  36.    int i;
  37.    int p;
  38.    String date=new SimpleDateFormat("yyyyMMddHHmmss").format(Calendar.getInstance().getTime());
  39.    base = "1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ";
  40.    temp = "";
  41.    for (i = 0; i < sLen; i++) {
  42.     p = (int) (Math.random() * 37);
  43.     if (p > 35)
  44.      p = 35;
  45.     temp += base.substring(p, p + 1);
  46.    }
  47.    return (date+temp);
  48. }
  49. public static void main(String[] args) {
  50.    /*
  51.    * java.util.Random r = new java.util.Random();//不带种子 //java.util.Random
  52.    * r = new java.util.Random(10);//带种子 for (int i = 0; i < 10; i++) {
  53.    * System.out.println(r.nextInt()); }
  54.    */
  55.    //RandomName test = new RandomName();
  56.    //System.out.println(test.ConfirmId(15));
  57. }
  58. }
Form类:

 

  1. package kymanage.kybasic.form;
  2. import java.util.ArrayList;
  3. import java.util.List;
  4. import javax.servlet.http.HttpServletRequest;
  5. import org.apache.struts.action.ActionErrors;
  6. import org.apache.struts.action.ActionForm;
  7. import org.apache.struts.action.ActionMapping;
  8. import org.apache.struts.upload.FormFile;
  9. /**
  10. * @author coffee
  11. *
  12. */
  13. public class KybasicAttachmentForm extends ActionForm {
  14. // 附件表
  15. private String attId;
  16. private String attFId;
  17. private String attName;
  18. private String attUrl;
  19. private String attFormat;
  20. private String attSize;
  21. private String attFileTable;
  22. private String attStandby1;
  23. private String attStandby2;
  24. private String attStandby3;
  25. private String attStandby4;
  26. private String attStandby5;
  27. private String attStandby6;
  28. private List list;
  29. private List fileList;
  30. //上传文件
  31. private FormFile theFile;//form表单里input对应的file类型的名字
  32. public ActionErrors validate(ActionMapping mapping,
  33.     HttpServletRequest request) {
  34.    return null;
  35. }
  36. public void reset(ActionMapping mapping, HttpServletRequest request) {
  37. }
  38. public String getAttId() {
  39.    return attId;
  40. }
  41. public void setAttId(String attId) {
  42.    this.attId = attId;
  43. }
  44. public String getAttFId() {
  45.    return attFId;
  46. }
  47. public void setAttFId(String attFId) {
  48.    this.attFId = attFId;
  49. }
  50. //其它getter和setter方法.....................
  51. public FormFile getTheFile() {
  52.    return theFile;
  53. }
  54. public void setTheFile(FormFile theFile) {
  55.    this.theFile = theFile;
  56. }
  57. public List getFileList() {
  58.    return fileList;
  59. }
  60. public void setFileList(List fileList) {
  61.    this.fileList = fileList;
  62. }
  63. }

Action类:

  1. package kymanage.kybasic.action;
  2. import java.io.File;
  3. import java.io.FileOutputStream;
  4. import java.io.IOException;
  5. import java.io.InputStream;
  6. import java.io.OutputStream;
  7. import java.io.PrintWriter;
  8. import java.text.SimpleDateFormat;
  9. import java.util.ArrayList;
  10. import java.util.Calendar;
  11. import java.util.Date;
  12. import java.util.Iterator;
  13. import java.util.List;
  14. import javax.servlet.ServletException;
  15. import javax.servlet.http.HttpServletRequest;
  16. import javax.servlet.http.HttpServletResponse;
  17. import javax.servlet.http.HttpSession;
  18. import org.apache.struts.action.ActionForm;
  19. import org.apache.struts.action.ActionForward;
  20. import org.apache.struts.action.ActionMapping;
  21. import org.apache.struts.upload.FormFile;
  22. import kymanage.kybasic.basicaction.KybasicBasicAction;
  23. import kymanage.kybasic.common.RandomName;
  24. import kymanage.kybasic.form.KybasicAttachmentForm;
  25. /**
  26. * @author coffee
  27. *
  28. */
  29. public class KybasicAttachmentAction extends KybasicBasicAction {
  30. /**
  31. * 附件上传操作
  32. * @param mapping
  33. * @param form
  34. * @param request
  35. * @param response
  36. * @return
  37. * @throws ServletException
  38. * @throws IOException
  39. */
  40. public ActionForward fileUpload(ActionMapping mapping, ActionForm form,
  41.     HttpServletRequest request, HttpServletResponse response)
  42.     throws ServletException, IOException {
  43.    String type=request.getParameter("type");
  44.    String infoIdStr=request.getParameter("infoId");
  45.    Long infoId=(long)0;
  46.    if(infoIdStr!=null && !infoIdStr.equals("")){
  47.     infoId=Long.parseLong(infoIdStr);
  48.    }
  49.    KybasicAttachmentForm kybasicAttachmentForm = (KybasicAttachmentForm) form;
  50.    String attTFileTable=request.getParameter("attTFileTable");
  51.    String path = request.getContextPath();
  52.    request.setCharacterEncoding("GBK");// 必须写在PrintWriter前面,否则乱码显示
  53.    response.setContentType("text/html;charset=GBK");// 必须写在PrintWriter前面,否则乱码显示
  54.    PrintWriter out = response.getWriter();
  55.   
  56.    //设置目录,此处目录是按'年/年-月/年-月-日/'这样的目录来放置,文件名采用随机生成的.
  57.    String parentDirName = "upload";
  58.    String secondDirName = attTFileTable;
  59.    String thirdDirName = new SimpleDateFormat("yyyy").format(Calendar.getInstance().getTime());
  60.    String forthDirName = new SimpleDateFormat("yyyy-MM").format(Calendar.getInstance().getTime());
  61.    String fifthDirName = new SimpleDateFormat("yyyy-MM-dd").format(Calendar.getInstance().getTime());
  62.    String parentDir = this.servlet.getServletContext().getRealPath("/"+parentDirName);
  63.    String secondDir = this.servlet.getServletContext().getRealPath("/"+parentDirName+"/"+secondDirName);
  64.    String thirdDir = this.servlet.getServletContext().getRealPath("/"+parentDirName+"/"+secondDirName+"/"+thirdDirName);
  65.    String forthDir = this.servlet.getServletContext().getRealPath("/"+parentDirName+"/"+secondDirName+"/"+thirdDirName+"/"+forthDirName);
  66.    String dir = this.servlet.getServletContext().getRealPath("/"+parentDirName+"/"+secondDirName+"/"+thirdDirName+"/"+forthDirName+"/"+fifthDirName);
  67.   
  68.    if (parentDir == null || secondDir == null || dir == null) {
  69.     out.print("无法访问存储目录!");
  70.    }
  71.    File fRootDir = new File(parentDir);
  72.    if (!fRootDir.exists()) {
  73.     if (!fRootDir.mkdir()) {
  74.      out.println("无法创建存储目录!");
  75.     }
  76.    }
  77.    File fSecondDir = new File(secondDir);
  78.    if (!fSecondDir.exists()) {
  79.     if (!fSecondDir.mkdir()) {
  80.      out.println("无法创建存储目录!");
  81.     }
  82.    }
  83.    File fThirdDir = new File(thirdDir);
  84.    if (!fThirdDir.exists()) {
  85.     if (!fThirdDir.mkdir()) {
  86.      out.println("无法创建存储目录!");
  87.     }
  88.    }
  89.    File fForthDir = new File(forthDir);
  90.    if (!fForthDir.exists()) {
  91.     if (!fForthDir.mkdir()) {
  92.      out.println("无法创建存储目录!");
  93.     }
  94.    }
  95.    File fUploadDir = new File(dir);
  96.    if (!fUploadDir.exists()) {
  97.     if (!fUploadDir.mkdir()) {
  98.      out.println("无法创建存储目录!");
  99.     }
  100.    }
  101.   
  102.    List<String> list = new ArrayList<String>();// 注意文件类型最好全部用小写,此处设置的为不允许上传的类型
  103.    list.add("exe");
  104.    list.add("com");
  105.    list.add("dll");
  106.    list.add("java");
  107.    list.add("class");
  108.    list.add("jsp");
  109.    list.add("js");
  110.    list.add("html");
  111.    list.add("htm");
  112.    list.add("ini");
  113.    list.add("inf");
  114.    if (!dir.endsWith("/")) {
  115.     dir = dir.concat("/");
  116.    }
  117.   
  118.    FormFile file = kybasicAttachmentForm.getTheFile();
  119.    if (file == null || (file != null && file.getFileSize()==0)) {//判断上传数据是否为空
  120.     out.println("<html><head><title>附件上传</title></head>");
  121.     out.println("<body bgcolor=/"#EFF9FC/">");
  122.     out.println("<p align=/"center/"");
  123.     out.println("<br><br>");
  124.     out.println("上传文件数据不能为空!<br><br>");
  125.     out.println("<a href=" + path
  126.       + "/kybasicAttachment.do?action=fileUploadList&attTFileTable="+attTFileTable+"&type="+type+"&infoId="+infoId
  127.       + "><font color=#3300FF>返回上一页</font></a>");
  128.     out.println("</p>");
  129.     out.println("</body></html>");
  130.     return mapping.getInputForward();
  131.    }
  132.    String fname = file.getFileName();// 获取文件名
  133.    String ext = fname.substring(fname.lastIndexOf(".") + 1, fname.length());
  134.    // 获取文件类型,即扩展名,通过String类的substring方法截取字符串,lastIndexOf获取某个字符串最后出现的索引。
  135.    ext = ext.toLowerCase();// 全部转换成小写。
  136.    if (list.contains(ext)) {// 判断该类型是否为允许上传的文件类型
  137.     out.println("<html><head><title>附件上传</title></head>");
  138.     out.println("<body bgcolor=/"#EFF9FC/">");
  139.     out.println("<p align=/"center/"");
  140.     out.println("<br><br>");
  141.     out.println("不支持该文件类型上传,该文件类型是:" + ext + "<br><br>");
  142.     out.println("<a href=" + path
  143.       + "/kybasicAttachment.do?action=fileUploadList&attTFileTable="+attTFileTable+"&type="+type+"&infoId="+infoId
  144.       + "><font color=#3300FF>返回上一页</font></a>");
  145.     out.println("</p>");
  146.     out.println("</body></html>");
  147.     return mapping.getInputForward();
  148.    }
  149.    int fsize = file.getFileSize();// 获取文件大小
  150.    if (fsize > 1024 * 1024 * 20) {// 判断文件大小是否为允许上传的大小。
  151.     out.println("<html><head><title>附件上传</title></head>");
  152.     out.println("<body bgcolor=/"#EFF9FC/">");
  153.     out.println("<p align=/"center/"");
  154.     out.println("<br><br>");
  155.     out.println("上传文件太大,最大支持20M上传<br><br>");
  156.     out.println("<a href=" + path
  157.       + "/kybasicAttachment.do?action=fileUploadList&attTFileTable="+attTFileTable+"&type="+type+"&infoId="+infoId
  158.       + "><font color=#3300FF>返回上一页</font></a>");
  159.     out.println("</p>");
  160.     out.println("</body></html>");
  161.     return mapping.getInputForward();
  162.    }
  163.    InputStream in = null;// 输入流用来读取用户上传文件
  164.    OutputStream outputStream = null;// 用来将用户上传文件存出在服务器特定目录中。
  165.    try {
  166.     in = file.getInputStream();
  167.     String autoName= RandomName.ConfirmId(15) + "." + ext;//RandomName.ConfirmId()这个方法是自己随机生成文件名方法
  168.     outputStream = new FileOutputStream(dir + autoName);
  169.     int byteread = 0;
  170.     byte[] bytes = new byte[8192];
  171.     while ((byteread = in.read(bytes, 0, 8192)) != -1) {
  172.      outputStream.write(bytes, 0, byteread);
  173.     }
  174.     String attTName=fname;//附件原名称
  175.     String attTRealName=autoName;
  176.     String attTUrl="/"+secondDirName+"/"+thirdDirName+"/"+forthDirName+"/"+fifthDirName+"/";//附件实际地址
  177.     String attTFormat=ext.toUpperCase();//附件格式
  178.     HttpSession session=request.getSession();
  179.     String userSno = (String)session.getAttribute("userSNo");
  180.     Long attTSize=(long)fsize;
  181.     String attTStandby1="";
  182.     String attTStandby2="";
  183.     String attTStandby3="";
  184.     Long attTStandby4=(long)0;
  185.     Long attTStandby5=(long)0;
  186.     Long attTStandby6=(long)0;
  187.     //将附件信息新增到数据库中
  188.     kybasicAttachmentTmpService.save(attTName, attTRealName, attTUrl, attTFormat, attTSize, attTFileTable, userSno, attTStandby1, attTStandby2, attTStandby3, attTStandby4, attTStandby5, attTStandby6);
  189.    } catch (Exception e) {
  190.     out.println("<html><head><title>附件上传</title></head>");
  191.     out.println("<body bgcolor=/"#EFF9FC/">");
  192.     out.println("<p align=/"center/"");
  193.     out.println("<br><br>");
  194.     out.println("由于网络和服务器问题,上传实败<br><br>");
  195.     out.println("<a href=" + path
  196.       + "/kybasicAttachment.do?action=fileUploadList&attTFileTable="+attTFileTable+"&type="+type+"&infoId="+infoId
  197.       + "><font color=#3300FF>返回上一页</font></a>");
  198.     out.println("</p>");
  199.     out.println("</body></html>");
  200.     return mapping.getInputForward();
  201.    } finally {
  202.     try {
  203.      in.close();
  204.      outputStream.close();
  205.     } catch (Exception e) {
  206.      return mapping.getInputForward();
  207.     }
  208.    }
  209.    ActionForward forward=mapping.findForward("file_upload"); 
  210.    ActionForward newForward=new ActionForward(); 
  211.    String newPath=forward.getPath() +"&attTFileTable="+attTFileTable+"&type="+type+"&infoId="+infoId; 
  212.    newForward.setPath(newPath); 
  213.    return newForward;
  214. }
  215. }

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值