正无组件图文混合上传,功能强大,无须数据库,支持中文! 
该程序支持任何文本和二进制格式文件的上传;支持文件表单域和普通表单域混合上传;支持中文文件名;支持覆盖上传和文件同名时自动修改文件名;支持同时上传多个文件,而且多个文件表单域名可以相同;支持上传文件大小的控制…… 我自己感觉很不错哟:) 
本程序无须任何数据库支持,直接将上传的文件保存到服务器指定的路径下。
测试环境:Windows2000 + IIS 5.0(对ADO版本有要求)
已知BUG:利用相同文件表单名以唯一文件名方式同时上传多个文件,且服务器上存在多个相同文件名时,只有第一个文件会自动改名上传成功,然后程序报错。
源代码如下,欢迎大家参考指正:文件名:UploadX.asp
<%
Dim FormData, FormSize, Divider, bCrLf
FormSize = Request.TotalBytes
FormData = Request.BinaryRead(FormSize)
bCrLf = ChrB(13) & ChrB(10)
Divider = LeftB(FormData, InStrB(FormData, bCrLf) - 1)'将上传的文件保存到path所指定的目录下面。
'Formfield 上传表单的"file"域名
'Path 要保存文件的服务器绝对路径,形式为:"d:\path\subpath"或"d:\path\subpath\"
'MaxSize 限制上传文件的最大长度,以KByte为单位
'SavType 服务器保存文件的方式:
' 0 唯一文件名方式,如果有同名则自动改名;
' 1 报错方式,如果有同名则出错;
' 2 覆盖方式,如果有同名则覆盖原来的文件
Function SaveFile(FormFileField, Path, MaxSize, SavType)
Dim StreamObj,StreamObj1
Set StreamObj = Server.CreateObject("ADODB.Stream")
Set StreamObj1 = Server.CreateObject("ADODB.Stream")
StreamObj.Mode = 3
StreamObj1.Mode = 3
StreamObj.Type = 1
StreamObj1.Type = 1
SaveFile = ""
StartPos = LenB(Divider) + 2
FormFileField = Chr(34) & FormFileField & Chr(34)
If Right(Path,1) <> "\" Then
Path = Path & "\"
End If
Do While StartPos > 0
strlen = InStrB(StartPos, FormData, bCrLf) - StartPos
SearchStr = MidB(FormData, StartPos, strlen)
If InStr(bin2str(SearchStr), FormFileField) > 0 Then
FileName = bin2str(GetFileName(SearchStr,path,SavType))
If FileName <> "" Then
FileStart = InStrB(StartPos, FormData, bCrLf & bCrLf) + 4
FileLen = InStrB(StartPos, FormData, Divider) - 2 - FileStart
If FileLen <= MaxSize*1024 Then
FileContent = MidB(FormData, FileStart, FileLen)
StreamObj.Open
StreamObj1.Open
StreamObj.Write FormData
StreamObj.Position=FileStart-1
StreamObj.CopyTo StreamObj1,FileLen
If SavType =0 Then
SavType = 1
End If 
StreamObj1.SaveToFile Path & FileName, SavType
StreamObj.Close
StreamObj1.Close
If SaveFile <> "" Then
SaveFile = SaveFile & "," & FileName
Else
SaveFile = FileName
End If
Else
If SaveFile <> "" Then
SaveFile = SaveFile & ",*TooBig*"
Else
SaveFile = "*TooBig*"
End If
End If
End If
End If
If InStrB(StartPos, FormData, Divider) < 1 Then
Exit Do
End If
StartPos = InStrB(StartPos, FormData, Divider) + LenB(Divider) + 2
Loop
End FunctionFunction GetFormVal(FormName)
GetFormVal = ""
StartPos = LenB(Divider) + 2
FormName = Chr(34) & FormName & Chr(34)
Do While StartPos > 0
strlen = InStrB(StartPos, FormData, bCrLf) - StartPos
SearchStr = MidB(FormData, StartPos, strlen)
If InStr(bin2str(SearchStr), FormName) > 0 Then
ValStart = InStrB(StartPos, FormData, bCrLf & bCrLf) + 4
ValLen = InStrB(StartPos, FormData, Divider) - 2 - ValStart
ValContent = MidB(FormData, ValStart, ValLen)
If GetFormVal <> "" Then
GetFormVal = GetFormVal & "," & bin2str(ValContent)
Else
GetFormVal = bin2str(ValContent)
End If
End If
If InStrB(StartPos, FormData, Divider) < 1 Then
Exit Do
End If
StartPos = InStrB(StartPos, FormData, Divider) + LenB(Divider) + 2
Loop
End FunctionFunction bin2str(binstr)
Dim varlen, clow, ccc, skipflag
skipflag = 0
ccc = ""
varlen = LenB(binstr)
For i = 1 To varlen
If skipflag = 0 Then
clow = MidB(binstr, i, 1)
If AscB(clow) > 127 Then
ccc = ccc & Chr(AscW(MidB(binstr, i + 1, 1) & clow))
skipflag = 1
Else
ccc = ccc & Chr(AscB(clow))
End If
Else
skipflag = 0
End If
Next
bin2str = ccc
End FunctionFunction str2bin(str)
For i = 1 To Len(str)
str2bin = str2bin & ChrB(Asc(Mid(str, i, 1)))
Next
End FunctionFunction GetFileName(str,path,savtype)
Set fs = Server.CreateObject("Scripting.FileSystemObject")
str = RightB(str,LenB(str)-InstrB(str,str2bin("filename="))-9)
GetFileName = ""
FileName = ""
For i = LenB(str) To 1 Step -1
If MidB(str, i, 1) = ChrB(Asc("\")) Then
FileName = MidB(str, i + 1, LenB(str) - i - 1)
Exit For
End If
Next
If savtype = 0 and fs.FileExists(path & bin2str(FileName)) = True Then
hFileName = FileName
rFileName = ""
For i = LenB(FileName) To 1 Step -1
If MidB(FileName, i, 1) = ChrB(Asc(".")) Then
hFileName = LeftB(FileName, i-1)
rFileName = RightB(FileName, LenB(FileName)-i+1)
Exit For
End If
Next
For i = 0 to 9999 
'hFileName = hFileName & str2bin(i)
If fs.FileExists(path & bin2str(hFileName) & i & bin2str(rFileName)) = False Then
FileName = hFileName & str2bin(i) & rFileName
Exit For
End If
Next
End If
Set fs = Nothing
GetFileName = FileName
End Function
%>应用举例:upload.htm<html><head>
<meta http-equiv="Content-Language" content="zh-cn">
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<meta name="GENERATOR" content="Microsoft FrontPage 4.0">
<meta name="ProgId" content="FrontPage.Editor.Document">
<title>New Page 1</title>
</head><body><form method="POST" action="upload.asp" enctype="multipart/form-data">
<p>姓名:<input type="text" name="name" size="20"></p>
<p>城市:<input type="text" name="city" size="20"></p>
<p>爱好:1、<input type="text" name="lover" size="10"> 2、<input type="text" name="lover" size="10"></p>
<p>性别:<input type="radio" value="男" checked name="sex">男 
<input type="radio" name="sex" value="女">女</p> 
<p>省份:<select size="1" name="province">
<option selected value="江苏">江苏</option>
<option value="山西">山西</option></select></p>
爱好(补充):3、<input type="text" name="lover" size="10"> 4、<input type="text" name="lover" size="10">
<p>作品1:<input type="file" name="fruit" size="20"></p>
<p>作品1:<input type="file" name="fruit" size="20"></p>
<p>作品2:<input type="file" name="fruit2" size="20"></p>
<p><input type="submit" value="提交" name="subbutt"><input type="reset" value="全部重写" name="rebutt"></p>
</form></body></html>
upload.asp<%@ LANGUAGE = VBScript %>
<!-- #include file="uploadx.asp" -->
<%
Response.Write "<br>Name=""" & GetFormVal("name") & """"
Response.Write "<br>Sex=""" & GetFormVal("sex") & """"
Response.Write "<br>province=""" & GetFormVal("province") & """"
Response.Write "<br>city=""" & GetFormVal("city") & """"
Response.Write "<br>lover=""" & GetFormVal("lover") & """"
dim filename
path = Server.MapPath("./")
filename = SaveFile("fruit",path,1024,0)
If filename <> "*TooBig*" Then
Response.Write "<br><br>""" & filename & """已经上传"
Else
Response.Write "<br><br>文件超出限制太大"
End IFfilename = SaveFile("fruit2",path,1024,0)
If filename <> "*TooBig*" Then
Response.Write "<br><br>""" & filename & """已经上传"
Else
Response.Write "<br><br>文件超出限制太大"
End IF
%> 
 
 

解决方案 »

  1.   

    用jspSmartUpload上转。
    很好!
      

  2.   

    <%@ page contentType="text/html;charset=GB2312" language="java"
             import="java.sql.*,java.util.Date,com.*" %>
    <jsp:useBean id="mySmartUpload" scope="page" class="com.jspsmart.upload.SmartUpload" />
    <%@ page import="javax.servlet.*"%>
    <%String pa=request.getRealPath("/");
    out.println(pa);
    Connection con = null;
    try
      {
        
      // Variables
    int count=0;         // Initialization
    mySmartUpload.initialize(pageContext); // Upload
    mySmartUpload.upload(); // Select each file
    for (int i=0;i<mySmartUpload.getFiles().getCount();i++){ // Retreive the current file
    com.jspsmart.upload.File myFile = mySmartUpload.getFiles().getFile(i); // Save it only if this file exists
    if (!myFile.isMissing()) { // Save the files with its original names in a virtual path of the web server       
    myFile.saveAs(pa+"/upload/" + myFile.getFileName());
    // myFile.saveAs("/upload/" + myFile.getFileName(), mySmartUpload.SAVE_VIRTUAL); // sample with a physical path
    // myFile.saveAs("c:\\temp\\" + myFile.getFileName(), mySmartUpload.SAVE_PHYSICAL); //  Display the properties of the current file
    out.println("FieldName = " + myFile.getFieldName() + "<BR>");
    out.println("Size = " + myFile.getSize() + "<BR>");
    out.println("FileName = " + myFile.getFileName() + "<BR>");
    out.println("FileExt = " + myFile.getFileExt() + "<BR>");
    out.println("FilePathName = " + myFile.getFilePathName() + "<BR>");
    out.println("ContentType = " + myFile.getContentType() + "<BR>");
    out.println("ContentDisp = " + myFile.getContentDisp() + "<BR>");
    out.println("TypeMIME = " + myFile.getTypeMIME() + "<BR>");
    out.println("SubTypeMIME = " + myFile.getSubTypeMIME() + "<BR>"); count ++; }
    String leix=mySmartUpload.getRequest().getParameter("leix");
    String pat= myFile.getFileName();
    //pat=new String(pat.getBytes("iso-8859-1"),"GBK");        String path="../../upload/"+pat;
    out.println(path);
             } // Display the number of files which could be uploaded 
    out.println("<BR>" + mySmartUpload.getFiles().getCount() + " files could be uploaded.<BR>"); // Display the number of files uploaded 
    out.println(count + " file(s) uploaded.");  
      }
    catch (Exception e)
      {
      out.println(e.getMessage());
      }%>
      

  3.   

    可以使用jspSmartUpload组件,方便。也可自己编写servlet,
    示例如下,有删改,大概原理正确:import java.io.*;
    import java.lang.*;
    import java.util.*;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.ServletInputStream;
    import javax.servlet.ServletException;
    public class upload{private static String newline = "\n";
    private String RelativeDir = "";
    private String uploadDirectory = ".";
    private String ContentType = "";
    private String CharacterEncoding = "";private int    var_num=9;
    private String parameterNames[] = new String[var_num+1];public upload()
    {}private String getFileName(String s){ int i = s.lastIndexOf("\\"); if(i < 0 ){ // i >= s.length() - 1
    i = s.lastIndexOf("/");
    if(i < 0 ) // i >= s.length() - 1
    return s;
    }
    return s.substring(i + 1);
    }public void setRelativeDir(String s){
    RelativeDir=s;
    }public void setUploadDirectory(String s){
    uploadDirectory = s;
    }public void setParameterNames(String s[]){ for(int i=0; i<var_num; i++){
    parameterNames[i] = s[i];
    }
    }public void setContentType(String s){
    ContentType = s;
    int j;
    if((j = ContentType.indexOf("boundary=")) != -1){
    ContentType = ContentType.substring(j + 9);
    ContentType = "--" + ContentType;
    }
    }public void setCharacterEncoding(String s){
    CharacterEncoding = s;
    }public String uploadFile( HttpServletRequest req) throws ServletException, IOException{
    setCharacterEncoding(req.getCharacterEncoding());
    setContentType(req.getContentType()); return(uploadFile(req.getInputStream()));
    }public String uploadFile( ServletInputStream servletinputstream) throws ServletException, IOException{ String s5 = null;
    String filename = null;
    byte Linebyte[] = new byte[4096];
    byte outLinebyte[] = new byte[4096];
    int ai[] = new int[1];
    int ai1[] = new int[1]; String line; //先增加的变量
    String tmp_type = "";  //文件类型
    String tmp_name = "";  //文件名
    long   tmp_size = 0;   //文件大小 String tmp_array[]=new String[var_num+3];
    String var_str = "";
    String return_str = "";
    int    l=0; //得到request传递的各变量的值
    while((line = readLine(Linebyte, ai, servletinputstream, CharacterEncoding)) != null){ if(parameterNames[l]!=null){
    var_str = "name=\"" + parameterNames[l] + "\"";
    int tmp_pos=line.indexOf(var_str);
    if(tmp_pos >= 0){
    line = readLine(Linebyte, ai, servletinputstream, CharacterEncoding);
    line = readLine(Linebyte, ai, servletinputstream, CharacterEncoding); tmp_array[3+l] = line.trim();
    l++;
    }
    }
    else {
    int i = line.indexOf("filename=");
    if(i >= 0){
    line = line.substring(i + 10); if((i = line.indexOf("\"")) > 0)
    line = line.substring(0, i);
    break;
    }
    }
    } //获取文件信息并上传
    filename = line; if(filename != null && !filename.equals("\"")){ filename = getFileName(filename); int j=filename.indexOf(".");
    if(j>0){
    tmp_type=filename.substring(j+1);
    tmp_name=filename.substring(0,j);
    } String sContentType = readLine(Linebyte, ai, servletinputstream, CharacterEncoding); if(sContentType.indexOf("Content-Type") >= 0)
    readLine(Linebyte, ai, servletinputstream, CharacterEncoding); //File(String parent, String child)
    //Creates a new File instance from a parent pathname string
    //and a child pathname string.
    File file = new File(uploadDirectory, filename); int k=0;
    String old_name=tmp_name; while(file.exists()){
    k++;
    tmp_name=old_name + k;
    filename=tmp_name + "." + tmp_type;
    file = new File(uploadDirectory, filename);
    }
    tmp_array[0]=tmp_name;
    tmp_array[1]=tmp_type;
    tmp_array[2]=""; //文件大小fileoutputstream = new FileOutputStream(file); while((sContentType = readLine(Linebyte, ai, servletinputstream, CharacterEncoding)) != null){
    if(sContentType.indexOf(ContentType) == 0 && Linebyte[0] == 45)
    break; if(s5 != null){
    //write(byte[] b, int off, int len)
    //Writes len bytes from the specified byte array starting
    //at offset off to this file output stream.
    fileoutputstream.write(outLinebyte, 0, ai1[0]);
    fileoutputstream.flush();
    }
    s5 = readLine(outLinebyte, ai1, servletinputstream, CharacterEncoding);
    if(s5 == null ) // s5.indexOf(ContentType) == 0 && outLinebyte[0] == 45
    break; fileoutputstream.write(Linebyte, 0, ai[0]);
    fileoutputstream.flush();
    } byte byte0; if(newline.length() == 1)
    byte0 = 2;
    else
    byte0 = 1; if(s5 != null && outLinebyte[0] != 45 && ai1[0] > newline.length() * byte0)
    fileoutputstream.write(outLinebyte, 0, ai1[0] - newline.length() * byte0); if(sContentType != null && Linebyte[0] != 45 && ai[0] > newline.length() * byte0)
    fileoutputstream.write(Linebyte, 0, ai[0] - newline.length() * byte0); fileoutputstream.close();
    return (return_str);
    }//获取非文件的变量值
    public String getParameter(HttpServletRequest req, String s) throws ServletException, IOException{ return (getParameter(req.getInputStream(),s));}public String getParameter( ServletInputStream servletinputstream,String s) throws ServletException, IOException{ byte Linebyte[] = new byte[4096];
    int ai[] = new int[1]; String line="";
    String tmp_str=""; //得到变量值
    int j=1;
    tmp_str = "name=\"" + s + "\"";
    while((line = readLine(Linebyte, ai, servletinputstream, CharacterEncoding))!=null){ tmp_str = "name=\"" + s + "\"";
    int i = line.indexOf(tmp_str);
    if(i >= 0){
    line = readLine(Linebyte, ai, servletinputstream, CharacterEncoding);
    line = readLine(Linebyte, ai, servletinputstream, CharacterEncoding);
    break;
    } }
    return tmp_str;
    }private String readLine(byte Linebyte[], int ai[], ServletInputStream servletinputstream, String CharacterEncoding){
    try{
    //readLine(byte[] buffer, int offset, int length)
    //Reads a line from the POST data.
    ai[0] = servletinputstream.readLine(Linebyte, 0, Linebyte.length);
    if(ai[0] == -1)
    return null;
    }catch(IOException _ex){
    return null;
    }
    try{
    if(CharacterEncoding == null){
    //用缺省的编码方式把给定的byte数组转换为字符串
    //String(byte[] bytes, int offset, int length)
    return new String(Linebyte, 0, ai[0]);
    }else{
    //用给定的编码方式把给定的byte数组转换为字符串
    //String(byte[] bytes, int offset, int length, String enc)
    return new String(Linebyte, 0, ai[0], CharacterEncoding);
    }
    }catch(Exception _ex){
    return null;
    }
    }
    }
      

  4.   

    恐怖,直接用JspSmartUpload不就得了,自己写的难以保证