也谈一下文件上传

来源:互联网 发布:怎么让mac自动获取dns 编辑:程序博客网 时间:2024/04/29 17:03
<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 728x15, 创建于 08-4-23MSDN */google_ad_slot = "3624277373";google_ad_width = 728;google_ad_height = 15;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 160x600, 创建于 08-4-23MSDN */google_ad_slot = "4367022601";google_ad_width = 160;google_ad_height = 600;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>

在这里看到很多讨论文件上传的文章,觉得各有利敝,有些只限于上传文件,而不能同时取得文本字段值,尤其是上传多个文件比较少,现本人做这个上传文件的类最多可支持上传255个文件,同时可取得文本字段值,请各位高手指正.

文件上传类:MoqUploadBean.java

package net.moq.www;import java.io.*;import java.util.*;import javax.servlet.*;import javax.servlet.http.*;/** * * 

Title: 文件上传类

*

Description: 既能对文件进行上传,又能取得输入框的值,最多可同时上传255个文件

*

Copyright: Copyright (c) 2002

*

Company: Tekson

* @author 莫琼 * @version 1.0 */public class MoqUploadBean { private String[] sourceFile = new String[255]; //源文件名 private String[] suffix = new String[255]; //文件后缀名 private String canSuffix = ".gif.jpg.jpeg.png"; //可上传的文件后缀名 private String objectPath = "c:/"; //目标文件目录 private String[] objectFileName = new String[255]; //目标文件名 private ServletInputStream sis = null; //输入流 private String[] description = new String[255]; //描述状态 private long size = 100 * 1024; //限制大小 private int count = 0; //已传输文件数目 private byte[] b = new byte[4096]; //字节流存放数组 private boolean successful = true; private Hashtable fields = new Hashtable(); public MoqUploadBean() { } //设置上传文件的后缀名 public void setSuffix(String canSuffix) { this.canSuffix = canSuffix; } //设置文件保存路径 public void setObjectPath(String objectPath) { this.objectPath = objectPath; } //设置文件保存路径 public void setSize(long maxSize) { this.size = maxSize; } //文件上传处理程序 public void setSourceFile(HttpServletRequest request) throws IOException { sis = request.getInputStream(); int a = 0; int k = 0; String s = ""; while ( (a = sis.readLine(b, 0, b.length)) != -1) { s = new String(b, 0, a); if ( (k = s.indexOf("filename="")) != -1) { // 取得文件数据 s = s.substring(k + 10); k = s.indexOf("""); s = s.substring(0, k); sourceFile[count] = s; k = s.lastIndexOf("."); suffix[count] = s.substring(k + 1); if (canTransfer(count)) { transferFile(count); } ++count; } else if ( (k = s.indexOf("name="")) != -1) { // 普通表单输入元素,获取输入元素名字 String fieldName = s.substring(k+6, s.length()-3); sis.readLine(b, 0, b.length); StringBuffer fieldValue = new StringBuffer(b.length); while ( (a = sis.readLine(b, 0, b.length)) != -1) { s = new String(b, 0, a-2); if ( (b[0] == 45) && (b[1] == 45) && (b[2] == 45) && (b[3] == 45) && (b[4] == 45)) { break; } else { fieldValue.append(s); } } fields.put(fieldName, fieldValue.toString()); } if (!successful) break; } } //取得表单元素值 public String getFieldValue(String fieldName) { if (fields == null || fieldName == null) { return null; } return (String) fields.get(fieldName); } //取得上传文件数 public int getCount() { return count; } //取得目标路径 public String getObjectPath() { return objectPath; } //取得源文件名 public String[] getSourceFile() { return sourceFile; } //取得目标文件名 public String[] getObjectFileName() { return objectFileName; } //取得上传状态描述 public String[] getDescription() { return description; } //判断上传文件的类型 private boolean canTransfer(int i) { suffix[i] = suffix[i].toLowerCase(); //这个是用来传图片的,各位可以把后缀名改掉或者不要这个条件 if (sourceFile[i].equals("") || (!(canSuffix.indexOf("."+suffix[i])>=0))) { description[i] = "ERR: File suffix is wrong."; return false; } else { return true; } } //上传文件转换 private void transferFile(int i) { String x = Long.toString(new java.util.Date().getTime()); try { objectFileName[i] = x + "." + suffix[i]; FileOutputStream out = new FileOutputStream(objectPath + objectFileName[i]); int a = 0; int k = 0; long hastransfered = 0; //标示已经传输的字节数 String s = ""; while ( (a = sis.readLine(b, 0, b.length)) != -1) { s = new String(b, 0, a); if ( (k = s.indexOf("Content-Type:")) != -1) { break; } } sis.readLine(b, 0, b.length); while ( (a = sis.readLine(b, 0, b.length)) != -1) { s = new String(b, 0, a); if ( (b[0] == 45) && (b[1] == 45) && (b[2] == 45) && (b[3] == 45) && (b[4] == 45)) { break; } out.write(b, 0, a); hastransfered += a; if (hastransfered >= size) { description[count] = "ERR: The file " + sourceFile[count] + " is too large to transfer. The whole process is interrupted."; successful = false; break; } } if (successful) { description[count] = "Right: The file " + sourceFile[count] + " has been transfered successfully."; } out.close(); if (!successful) { sis.close(); File tmp = new File(objectPath + objectFileName[count]); tmp.delete(); } } catch (IOException ioe) { description[i] = ioe.toString(); } } public static void main(String[] args) { System.out.println("Test OK"); }}

文件上传调用:MoqUpload.jsp

〈%@ page contentType="text/html; charset=GB2312" %>〈html>〈head>〈title>文件上载〈/title>〈/head>〈body>〈form action="MoqUploadSubmit.jsp" enctype="MULTIPART/FORM-DATA" method="post">作者姓名:〈input type="text" name="Author" />〈br />公司名称:〈input type="text" name="Company" />〈br />文件描述:〈input type="text" name="Comment" />〈br />选择文件1:〈input type="file" name="filename1" />〈br />选择文件2:〈input type="file" name="filename2" />〈br />选择文件3:〈input type="file" name="filename3" />〈br />选择文件4:〈input type="file" name="filename4" />〈br />〈input type="submit" value="上载" />〈/form>〈/body>〈/html>

文件上传提交:MoqUploadSubmit.jsp

〈%@ page contentType="text/html;charset=gb2312"%>〈jsp:useBean id="fileBean" scope="page" class="net.moq.www.MoqUploadBean" />〈%fileBean.setObjectPath("D:/Temp/");fileBean.setSize(10000*1024);fileBean.setSuffix(".gif.jpg.png.jpge.html.htm");fileBean.setSourceFile(request);String [] saSourceFile = fileBean.getSourceFile();String [] saObjectFile = fileBean.getObjectFileName();String [] saDescription = fileBean.getDescription();int iCount = fileBean.getCount();String sObjectPath = fileBean.getObjectPath();for(int i=0;i〈iCount;i++) {  out.println("〈br>源始文件:");  out.println(saSourceFile[i]);  out.println("〈br>目标文件:");  out.println(sObjectPath+saObjectFile[i]);  out.println("〈br>上传说明:");  out.println(saDescription[i]);  out.println("〈br>");}out.println("〈br>作者:" + fileBean.getFieldValue("Author"));out.println("〈br>公司:" + fileBean.getFieldValue("Company"));out.println("〈br>说明:" + fileBean.getFieldValue("Comment"));%>
<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 728x15, 创建于 08-4-23MSDN */google_ad_slot = "3624277373";google_ad_width = 728;google_ad_height = 15;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 160x600, 创建于 08-4-23MSDN */google_ad_slot = "4367022601";google_ad_width = 160;google_ad_height = 600;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>