我的想法是这样:
Web服务器(即数据库服务器)+FTP服务器。
BS条件下,登陆网址,访问Web服务器,然后点击上传的时候,在aspx页面连接FTP服务器,进行大文件的上传(平均每天上传1G,每个文件至少3M)。
下载时相同,访问WEB,然后直接连FTP服务器进行下载。
网络采用独享带宽托管,FTP服务器配置没问题。关于功能需求没什么问题,都可以轻松解决,但是性能需求比较高。
WEB服务器要求较低。采用自配服务器。不知我的想法结构是否可行,求高手提供意见。解决方案确定后结贴!

解决方案 »

  1.   

    我之前用PHP做一个文件上传系统的时候,也是想通过FTP服务器直接上传大文件.
    但是选择文件通过<input type="file">,这个东西上传的文件大小受到服务器配置的限制.当时限制的是2M.
    到最后也没有想到好的办法上传大文件.关注,学习
      

  2.   

    采用FTP上传,最主要是要使用它的断点续传功能。如果你直接调用.net的类库,是没有这个效果的。
    解决方法有几个:
    1.通过程序在FTP服务器上建立文件夹,然后手动打开FTP上传工具上传。
    2.调用activex控件
    3.使用开元的FTP工具,自己改代码,使其可以在.aspx页面中调用。
    我也深受这个问题的捆饶楼主有经验可以交流下。
      

  3.   

    在aspx页面连接FTP服务器,进行大文件的上传(平均每天上传1G,每个文件至少3M)。 
    ==================================
    就这句话。连接没问题,难道你直接传?1G传死人啊。网络断一下就挂
      

  4.   

    好像那个孟子E章有一篇关于大文件上传得,用webservice写的,不过搂主服务器配置低,我不知道到这样服务器资源损耗大不大
      

  5.   

    用FTP 比较好的,我们曾每天要传10G的数据(服务器比较好),觉得比较实在,用web自己写容易超时,风险比较大。
    搂主的想法基本是大家的想法 。
      

  6.   

    上传大文件问题想了很久了
    首先,B/S理论上来说似乎不可能实现断点蓄传,那比如说我要上传一个500M的东西,传到一半断了怎么办?
    在BS程序中怎么判断上传到FTP服务器是否成功,等等问题
    还好后来我那个项目需求改了,就没想这些了
    关注!
      

  7.   

    kingj2018兄的建议很中肯。
    但是我想尽量做到不用客户端EXE上传。最好用纯BS结构,实在不行加插件(这还得攻关一下。)
    至于WebService,还没有研究。
    重申一下,每天总量是1G,每次大约几百兆,每个文至少3M。FTP服务器配置没问题,网速也没问题。WEB服务器和数据库服务器一般。期待高手的讨论。求解决方案。
      

  8.   

    重申一下,每天总量是1G,每次大约几百兆,每个文至少3M。FTP服务器配置没问题,网速也没问题。WEB服务器和数据库服务器一般。=====================================================================
    难道非要用BS来上传?
    要不就专门用FTP工具来上传吧
    在BS里上传大文件,除非你做个插件出来,不然我觉得基本上不可能断点蓄传的吧?
    开发出个插件出来(假设可以实现,我也不知道行不行),还不如直接用FTP工具来上传呢。
      

  9.   

    我觉得关键是两点 
    1   断点续传 
    2   大文件。比如一个文件就1G。
    ====================================
    这回到我一开始的问题了:存WEB端可以解决断点续传么?如果可以。大文件就不是问题
    在WEB操作FTP,必须,也只能使用FtpWebResponse和FtpWebRequest这两个类。这两个类我是没找到支持断点续传的方法的哎期待高手给出解决方案。如果真能在WEB解决断点续传,我加100分送上,呵呵
      

  10.   

    说实话,我觉得使用bs结构上传大文件还是比较麻烦的;还是使用ActiveX实现比较好;
    不知道p2p能不能实现这方面的功能,没有做过所以也不好说阿
      

  11.   

    CS做過BS 沒有.幫頂.要 CS代碼 可以找我 .
      

  12.   

    这个不用讨论了,有现成的技术就用吧。
    大家可以看看网易相册和qq相册的上传,都是在客户端装个插件。
    我认为你这个需求应该输入特定需求,面向于具体用户,当功能简单时用BS可以,
    当问题比较复杂(大文件、大量)考虑采用插件的方式解决,否则单单用BS程序是无法从根本上解决这个问题的。
      

  13.   

    就相当于BS不推荐用户这么操作,所以asp.net里没有集成这样的功能,考虑别的方式进行变通吧
      

  14.   

    给他一个FTP帐号分配的权限功能,再给他一个flashxp下载
      

  15.   

    大文件的话,那http岂不要保存很长时间吗?但iis保持http连接时间有限制啊,过了就超时了
    如果用插件或者activex的话,那跟cs程序有什么区别呢?
      

  16.   

    如果是采取BS结构没有好的解决办法,实现FTP一定是要在本地的,要么就是装插件啊,这样就是CS了啊,所以不是很好办。
    现在比较流行的就是安装个客户端,然后好像是BS结构的样子,但实际解决等待达人。
      

  17.   

    FTP,以下是对FTP服务器的连接上传,下载等操作,是一个类文件
    [code=C#]
    using System;
    using System.Net;
    using System.Net.Sockets;
    using System.Text;
    using System.IO; namespace Net.FTP
    {
    /// <summary>
    /// FTP 的摘要说明。
    /// </summary>
    public class CFTP
    {
    private string strRemoteHost;
    private int strRemotePort;
    private string strRemotePath;
    private string strRemoteUser;
    private string strRemotePass;
    private Boolean bConnected; #region 内部变量
    /// <summary>
    /// 服务器返回的应答信息(包含应答码)
    /// </summary>
    private string strMsg;
    /// <summary>
    /// 服务器返回的应答信息(包含应答码)
    /// </summary>
    private string strReply;
    /// <summary>
    /// 服务器返回的应答码
    /// </summary>
    private int iReplyCode;
    /// <summary>
    /// 进行控制连接的socket
    /// </summary>
    private Socket socketControl;
    /// <summary>
    /// 传输模式
    /// </summary>
    private TransferType trType;
    /// <summary>
    /// 传输模式:二进制类型、ASCII类型
    /// </summary>
    public enum TransferType
    {
    /// <summary>
    /// Binary
    /// </summary>
    Binary,
    /// <summary>
    /// ASCII
    /// </summary>
    ASCII
    };
    /// <summary>
    /// 接收和发送数据的缓冲区
    /// </summary>
    private static int BLOCK_SIZE = 512;
    Byte[] buffer = new Byte[ BLOCK_SIZE];
    /// <summary>
    /// 编码方式
    /// </summary>
    Encoding ASCII = Encoding.Default;
    #endregion #region 内部函数  
    #region 构造函数
    /// <summary>
    /// 缺省构造函数
    /// </summary>
    public CFTP()
    {
    strRemoteHost  = "";
    strRemotePath  = "";
    strRemoteUser  = "";
    strRemotePass  = "";
    strRemotePort  = 21;
    bConnected     = false;
    } /// <summary>
    /// 构造函数
    /// </summary>
    /// <param name="remoteHost"></param>
    /// <param name="remotePath"></param>
    /// <param name="remoteUser"></param>
    /// <param name="remotePass"></param>
    /// <param name="remotePort"></param>
    public CFTP( string remoteHost, string remotePath, string remoteUser, string remotePass, int remotePort )
    {
    strRemoteHost  = remoteHost;
    strRemotePath  = remotePath;
    strRemoteUser  = remoteUser;
    strRemotePass  = remotePass;
    strRemotePort  = remotePort;
    Connect();
    }
    #endregion #region 登陆
    /// <summary>
    /// FTP服务器IP地址
    /// </summary>
      
    public string RemoteHost
    {
    get
    {
    return strRemoteHost;
    }
    set
    {
    strRemoteHost = value;
    }
    }
    /// <summary>
    /// FTP服务器端口
    /// </summary>
    public int RemotePort
    {
    get
    {
    return strRemotePort;
    }
    set
    {
    strRemotePort = value;
    }
    }
    /// <summary>
    /// 当前服务器目录
    /// </summary>
    public string RemotePath
    {
    get
    {
    return strRemotePath;
    }
    set
    {
    strRemotePath = value;
    }
    }
    /// <summary>
    /// 登录用户账号
    /// </summary>
    public string RemoteUser
    {
    set
    {
    strRemoteUser = value;
    }
    }
    /// <summary>
    /// 用户登录密码
    /// </summary>
    public string RemotePass
    {
    set
    {
    strRemotePass = value;
    }
    } /// <summary>
    /// 是否登录
    /// </summary>
    public bool Connected
    {
    get
    {
    return bConnected;
    }
    }
    #endregion
    #region 链接
    /// <summary>
    /// 建立连接 
    /// </summary>
    public void Connect()
    {
    socketControl = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
    IPEndPoint ep = new IPEndPoint(IPAddress.Parse(RemoteHost), strRemotePort);
    // 链接
    try
    {
    socketControl.Connect(ep);
    }
    catch(Exception)
    {
    throw new IOException("Couldn't connect to remote server");
    } // 获取应答码
    ReadReply();
    if(iReplyCode != 220)
    {
    DisConnect();
    throw new IOException(strReply.Substring(4));
    } // 登陆
    SendCommand("USER "+strRemoteUser);
    if( !(iReplyCode == 331 || iReplyCode == 230) )
    {
    CloseSocketConnect();//关闭连接
    throw new IOException(strReply.Substring(4));
    }
    if( iReplyCode != 230 )
    {
    SendCommand("PASS "+strRemotePass);
    if( !(iReplyCode == 230 || iReplyCode == 202) )
    {
    CloseSocketConnect();//关闭连接
    throw new IOException(strReply.Substring(4));
    }
    }
    bConnected = true; // 切换到目录
    ChDir(strRemotePath);
    }
    /// <summary>
    /// 关闭连接
    /// </summary>
    public void DisConnect()
    {
    if( socketControl != null )
    {
    SendCommand("QUIT");
    }
    CloseSocketConnect();
    } #endregion
    #region 传输模式 /// <summary>
    /// 设置传输模式
    /// </summary>
    /// <param name="ttType">传输模式</param>
    public void SetTransferType(TransferType ttType)
    {
    if(ttType == TransferType.Binary)
    {
    SendCommand("TYPE I");//binary类型传输
    }
    else
    {
    SendCommand("TYPE A");//ASCII类型传输
    }
    if (iReplyCode != 200)
    {
    throw new IOException(strReply.Substring(4));
    }
    else
    {
    trType = ttType;
    }
    }
    /// <summary>
    /// 获得传输模式
    /// </summary>
    /// <returns>传输模式</returns>
    public TransferType GetTransferType()
    {
    return trType;
    } #endregion #region 文件操作
    /// <summary>
    /// 获得文件列表
    /// </summary>
    /// <param name="strMask">文件名的匹配字符串</param>
    /// <returns></returns>
    public string[] Dir(string strMask)
    {
    // 建立链接
    if(!bConnected)
    {
    Connect();
    } //建立进行数据连接的socket
    Socket socketData = CreateDataSocket(); //传送命令
    SendCommand("NLST " + strMask); //分析应答代码
    if(!(iReplyCode == 150 || iReplyCode == 125 || iReplyCode == 226))
    {
    throw new IOException(strReply.Substring(4));
    } //获得结果
    strMsg = "";
    while(true)
    {
    int iBytes = socketData.Receive(buffer, buffer.Length, 0);
    strMsg += ASCII.GetString(buffer, 0, iBytes);
    if(iBytes < buffer.Length)
    {
    break;
    }
    }
    char[] seperator = {'\n'};
    string[] strsFileList = strMsg.Split(seperator);
    socketData.Close();//数据socket关闭时也会有返回码
    if(iReplyCode != 226)
    {
    ReadReply();
    if(iReplyCode != 226)
    {
    throw new IOException(strReply.Substring(4));
    }
    }
    return strsFileList;
    }
    /// <summary>
    /// 获取文件大小
    /// </summary>
    /// <param name="strFileName">文件名</param>
    /// <returns>文件大小</returns>
    private long GetFileSize(string strFileName)
    {
    if(!bConnected)
    {
    Connect();
    }
    SendCommand("SIZE " + Path.GetFileName(strFileName));
    long lSize=0;
    if(iReplyCode == 213)
    {
    lSize = Int64.Parse(strReply.Substring(4));
    }
    else
    {
    throw new IOException(strReply.Substring(4));
    }
    return lSize;
    }
      

  18.   

    上接以上代码
    /// <summary>
    /// 删除
    /// </summary>
    /// <param name="strFileName">待删除文件名</param>
    public void Delete(string strFileName)
    {
    if(!bConnected)
    {
    Connect();
    }
    SendCommand("DELE "+strFileName);
    if(iReplyCode != 250)
    {
    throw new IOException(strReply.Substring(4));
    }
    }
    /// <summary>
    /// 重命名(如果新文件名与已有文件重名,将覆盖已有文件)
    /// </summary>
    /// <param name="strOldFileName">旧文件名</param>
    /// <param name="strNewFileName">新文件名</param>
    public void Rename(string strOldFileName,string strNewFileName)
    {
    if(!bConnected)
    {
    Connect();
    }
    SendCommand("RNFR "+strOldFileName);
    if(iReplyCode != 350)
    {
    throw new IOException(strReply.Substring(4));
    }
    //  如果新文件名与原有文件重名,将覆盖原有文件
    SendCommand("RNTO "+strNewFileName);
    if(iReplyCode != 250)
    {
    throw new IOException(strReply.Substring(4));
    }
    }
    #endregion #region 上传和下载
    /// <summary>
    /// 下载一批文件
    /// </summary>
    /// <param name="strFileNameMask">文件名的匹配字符串</param>
    /// <param name="strFolder">本地目录(不得以\结束)</param>
    public void Get(string strFileNameMask,string strFolder)
    {
    if(!bConnected)
    {
    Connect();
    }
    string[] strFiles = Dir(strFileNameMask);
    foreach(string strFile in strFiles)
    {
    if(!strFile.Equals(""))//一般来说strFiles的最后一个元素可能是空字符串
    {
    Get(strFile,strFolder,strFile);
    }
    }
    }
    /// <summary>
    /// 下载一个文件
    /// </summary>
    /// <param name="strRemoteFileName">要下载的文件名</param>
    /// <param name="strFolder">本地目录(不得以\结束)</param>
    /// <param name="strLocalFileName">保存在本地时的文件名</param>
    public void Get(string strRemoteFileName,string strFolder,string strLocalFileName)
    {
    if(!bConnected)
    {
    Connect();
    }
    SetTransferType(TransferType.Binary);
    if (strLocalFileName.Equals(""))
    {
    strLocalFileName = strRemoteFileName;
    }
    if(!File.Exists(strLocalFileName))
    {
    Stream st = File.Create(strLocalFileName);
    st.Close();
    }
    FileStream output = new 
    FileStream(strFolder + "\\" + strLocalFileName,FileMode.Create);
    Socket socketData = CreateDataSocket();
    SendCommand("RETR " + strRemoteFileName);
    if(!(iReplyCode == 150 || iReplyCode == 125
    || iReplyCode == 226 || iReplyCode == 250))
    {
    throw new IOException(strReply.Substring(4));
    }
    while(true)
    {
    int iBytes = socketData.Receive(buffer, buffer.Length, 0);
    output.Write(buffer,0,iBytes);
    if(iBytes <= 0)
    {
    break;
    }
    }
    output.Close();
    if (socketData.Connected)
    {
    socketData.Close();
    }
    if(!(iReplyCode == 226 || iReplyCode == 250))
    {
    ReadReply();
    if(!(iReplyCode == 226 || iReplyCode == 250))
    {
    throw new IOException(strReply.Substring(4));
    }
    }
    }
    /// <summary>
    /// 上传一批文件
    /// </summary>
    /// <param name="strFolder">本地目录(不得以\结束)</param>
    /// <param name="strFileNameMask">文件名匹配字符(可以包含*和?)</param>
    public void Put(string strFolder,string strFileNameMask)
    {
    string[] strFiles = Directory.GetFiles(strFolder,strFileNameMask);
    foreach(string strFile in strFiles)
    {
    //strFile是完整的文件名(包含路径)
    Put(strFile);
    }
    }
    /// <summary>
    /// 上传一个文件
    /// </summary>
    /// <param name="strFileName">本地文件名</param>
    public void Put(string strFileName)
    {
    if(!bConnected)
    {
    Connect();
    }
    Socket socketData = CreateDataSocket();
    SendCommand("STOR "+Path.GetFileName(strFileName));
    if( !(iReplyCode == 125 || iReplyCode == 150) )
    {
    throw new IOException(strReply.Substring(4));
    }
    FileStream input = new 
    FileStream(strFileName,FileMode.Open);
    int iBytes = 0;
    while ((iBytes = input.Read(buffer,0,buffer.Length)) > 0)
    {
    socketData.Send(buffer, iBytes, 0);
    }
    input.Close();
    if (socketData.Connected)
    {
    socketData.Close();
    }
    if(!(iReplyCode == 226 || iReplyCode == 250))
    {
    ReadReply();
    if(!(iReplyCode == 226 || iReplyCode == 250))
    {
    throw new IOException(strReply.Substring(4));
    }
    }
    } #endregion #region 目录操作
    /// <summary>
    /// 创建目录
    /// </summary>
    /// <param name="strDirName">目录名</param>
    public void MkDir(string strDirName)
    {
    if(!bConnected)
    {
    Connect();
    }
    SendCommand("MKD "+strDirName);
    if(iReplyCode != 257)
    {
    throw new IOException(strReply.Substring(4));
    }
    }
    /// <summary>
    /// 删除目录
    /// </summary>
    /// <param name="strDirName">目录名</param>
    public void RmDir(string strDirName)
    {
    if(!bConnected)
    {
    Connect();
    }
    SendCommand("RMD "+strDirName);
    if(iReplyCode != 250)
    {
    throw new IOException(strReply.Substring(4));
    }
    }
    /// <summary>
    /// 改变目录
    /// </summary>
    /// <param name="strDirName">新的工作目录名</param>
    public void ChDir(string strDirName)
    {
    if(strDirName.Equals(".") || strDirName.Equals(""))
    {
    return;
    }
    if(!bConnected)
    {
    Connect();
    }
    SendCommand("CWD "+strDirName);
    if(iReplyCode != 250)
    {
    throw new IOException(strReply.Substring(4));
    }
    this.strRemotePath = strDirName;
    } #endregion
    /// <summary>
    /// 将一行应答字符串记录在strReply和strMsg
    /// 应答码记录在iReplyCode
    /// </summary>
    private void ReadReply()
    {
    strMsg = "";
    strReply = ReadLine();
    iReplyCode = Int32.Parse(strReply.Substring(0,3));
    }
    /// <summary>
    /// 建立进行数据连接的socket
    /// </summary>
    /// <returns>数据连接socket</returns>
    private Socket CreateDataSocket()
    {
    SendCommand("PASV");
    if(iReplyCode != 227)
    {
    throw new IOException(strReply.Substring(4));
    }
    int index1 = strReply.IndexOf('(');
    int index2 = strReply.IndexOf(')');
    string ipData = 
    strReply.Substring(index1+1,index2-index1-1);
    int[] parts = new int[6];
    int len = ipData.Length;
    int partCount = 0;
    string buf="";
    for (int i = 0; i < len && partCount <= 6; i++)
    {
    char ch = Char.Parse(ipData.Substring(i,1));
    if (Char.IsDigit(ch))
    buf+=ch;
    else if (ch != ',')
    {
    throw new IOException("Malformed PASV strReply: " + 
    strReply);
    }
    if (ch == ',' || i+1 == len)
    {
    try
    {
    parts[partCount++] = Int32.Parse(buf);
    buf="";
    }
    catch (Exception)
    {
    throw new IOException("Malformed PASV strReply: " + 
    strReply);
    }
    }
    }
    string ipAddress = parts[0] + "."+ parts[1]+ "." +
    parts[2] + "." + parts[3];
    int port = (parts[4] << 8) + parts[5];
    Socket s = new 
    Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
    IPEndPoint ep = new 
    IPEndPoint(IPAddress.Parse(ipAddress), port);
    try
    {
    s.Connect(ep);
    }
    catch(Exception)
    {
    throw new IOException("Can't connect to remote server");
    }
    return s;
    }
    /// <summary>
    /// 关闭socket连接(用于登录以前)
    /// </summary>
    private void CloseSocketConnect()
    {
    if(socketControl!=null)
    {
    socketControl.Close();
    socketControl = null;
    }
    bConnected = false;
    }
      

  19.   

    上接以上代码
    /// <summary>
    /// 读取Socket返回的所有字符串
    /// </summary>
    /// <returns>包含应答码的字符串行</returns>
    private string ReadLine()
    {
    while(true)
    {
    int iBytes = socketControl.Receive(buffer, buffer.Length, 0);
    strMsg += ASCII.GetString(buffer, 0, iBytes);
    if(iBytes < buffer.Length)
    {
    break;
    }
    }
    char[] seperator = {'\n'};
    string[] mess = strMsg.Split(seperator);
    if(strMsg.Length > 2)
    {
    strMsg = mess[mess.Length-2];
    //seperator[0]是10,换行符是由13和0组成的,分隔后10后面虽没有字符串,
    //但也会分配为空字符串给后面(也是最后一个)字符串数组,
    //所以最后一个mess是没用的空字符串
    //但为什么不直接取mess[0],因为只有最后一行字符串应答码与信息之间有空格
    }
    else
    {
    strMsg = mess[0];
    }
    if(!strMsg.Substring(3,1).Equals(" "))//返回字符串正确的是以应答码(如220开头,后面接一空格,再接问候字符串)
    {
    return ReadLine();
    }
    return strMsg;
    }
    /// <summary>
    /// 发送命令并获取应答码和最后一行应答字符串
    /// </summary>
    /// <param name="strCommand">命令</param>
    private void SendCommand(string strCommand)
    {
    Byte[] cmdBytes = ASCII.GetBytes((strCommand + "\r\n").ToCharArray());
    socketControl.Send(cmdBytes, cmdBytes.Length, 0);
    ReadReply();
    } #endregion
    }
    }
    [/code]
    以下代码在aspx页面中
    CFTP myftp=new CFTP("FTP服务器IP地址","文件目录,如果FTP锁定该目录,为空,否则填写名称","用户名","密码",端口号);
    myftp.Put("文件地址,如E:\\MMS.rar"); // 上传到服务器中
      

  20.   

    sunnystar365 的代码收藏待研究。如果用activex的话,这个东西怎么开发?还是用已有的三方插件?继续等待。
      

  21.   

    activex 过时了。太多的流氓软件使用activex了,现在流行用flash来上传文件。
      

  22.   

    没有数字签名的activex  在IE到达一定安全级别的时候,根本不給安全。设置IE可以了吧,也未必。现在保护IE设置的软件太多了,因为流氓软件太多了,用户根本不知道。
      

  23.   

    sunnystar365的代码也无法实现断点蓄传吧?
    不过貌似有一个上传文件夹的方法,但是这个具体在UI层上是怎么实现的呢?
    自己模拟一个file?上传文件夹?
      

  24.   

    直接用flash就可以上传了。http://www.codeproject.com/KB/aspnet/FlashUpload.aspx不用搞那么多高科技,比。.
      

  25.   

    BS的特点来说,用activex是现阶段的最好的选择
      

  26.   

    winner2050 提供的Flash上传非常好。相对于原来普通上传,至少解决了进度条的问题。就算这次不用,这个控件我也收藏了,好东西。
    但现在问题有3
    1 方式好像还是http上传,不是FTP。那么速度呢?会达到要求么?
    2 我在程序里要进行统计,上传文件名要进数据库,那么这个文件是在Flash控件里选择的,我如何得到文件名和文件大小?以便存到数据库?
    3 这个Fla文件我用FlashMX2004没打开,它是用什么版本做的?依旧焦虑观望中,期待大家继续讨论。
      

  27.   

    我说一点,前段时间我刚好做过类似的。如果上传者允许将该站点加入信任站点的话,就不用activex也不用flash。直接使用javascript + xmlhttp ,服务器端采用一个webservice 就OK。
    可以实现的有:
    1、文件大小无限制
    2、文件可以断点续传。
      

  28.   

    希望有人做一个类似QQ邮箱里的文件中转站的控件,应该不错吧,大伙可以试一下,希望有高手弄出来,刚学ASP。NET,学习中
      

  29.   

    学习http://topic.csdn.net/u/20080109/10/f9e457d8-1a91-4a5c-a468-65407bf5d127.html
      

  30.   

    用flash上传比较好点,可以看到进度
      

  31.   

    1.那个FLASH上传的我怎么不能用?一个LogOn.aspx的东西,而且除了HTML外,什么都看不到。是我自己的机器原因么?
    2.
    =====================================
    我说一点,前段时间我刚好做过类似的。 如果上传者允许将该站点加入信任站点的话,就不用activex也不用flash。直接使用javascript   +   xmlhttp   ,服务器端采用一个webservice   就OK。 
    可以实现的有: 
    1、文件大小无限制 
    2、文件可以断点续传。
    =========================================
    这个太牛X了,有源码么。发个看看吧。[email protected]
    谢谢了
      

  32.   

    我说一点,前段时间我刚好做过类似的。   如果上传者允许将该站点加入信任站点的话,就不用activex也不用flash。直接使用javascript       +       xmlhttp       ,服务器端采用一个webservice       就OK。   
    可以实现的有:   
    1、文件大小无限制   
    2、文件可以断点续传。 -----------------
    太牛了,不能公布源码!能不能透漏一些思路做法!
      

  33.   

    但是选择文件通过 <input   type="file"> ,这个东西上传的文件大小受到服务器配置的限制.当时限制的是2M. 在web.config里可以设置更大
      

  34.   

    using System;
    using System.Web;
    using System.Web.Services;
    using System.Web.Services.Protocols;[WebService(Namespace = "http://tempuri.org/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    public class Service : System.Web.Services.WebService
    {
        public Service () {        //Uncomment the following line if using designed components 
            //InitializeComponent(); 
        }    [WebMethod]
        public string SayHelloTo(string Name) {
            return "Hello "+Name;
        }
        
    }<html>
    <title>
    Call webservice with javascript and xmlhttp.
    </title>
    <body>
    [code=JScript]
    <script language="javascript"> //Test function with get method.
    function RequestByGet(data){ var xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); 
    //Webservice location.
    var URL="http://localhost:1323/WebSite6/Service.asmx/SayHelloTo?Name=Zach";
    xmlhttp.Open("GET",URL, false); 
    xmlhttp.SetRequestHeader ("Content-Type","text/xml; charset=utf-8"); 
    xmlhttp.SetRequestHeader ("SOAPAction","http://tempuri.org/SayHelloTo"); 
    xmlhttp.Send(data); 
    var result = xmlhttp.status; 
    //OK
    if(result==200) { 
    document.write(xmlhttp.responseText); 

    xmlhttp = null; 
    } //Test function with post method
    function RequestByPost(value)
    {
    var data;
    data = '<?xml version="1.0" encoding="utf-8"?>'; 
    data = data + '<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">'; 
    data = data + '<soap:Body>'; 
    data = data + '<SayHelloTo xmlns="http://tempuri.org/">'; 
    data = data + '<Name>'+value+'</Name>'; 
    data = data + '</SayHelloTo>'; 
    data = data + '</soap:Body>'; 
    data = data + '</soap:Envelope>'; var xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); 
    var URL="http://localhost:1323/WebSite6/Service.asmx";
    xmlhttp.Open("POST",URL, false); 
    xmlhttp.SetRequestHeader ("Content-Type","text/xml; charset=gb2312"); 
    xmlhttp.SetRequestHeader ("SOAPAction","http://tempuri.org/SayHelloTo"); 
    xmlhttp.Send(data); 
    document.write( xmlhttp.responseText); }</Script><input type="button" value="CallWebserviceByGet" onClick="RequestByGet(null)">
    <input type="button" value="CallWebserviceByPost" onClick="RequestByPost('Zach')"></body>
    </html>
    [/code]
      

  35.   

    我找了部分Javascript+xmlhttp调用Webservice的资料方法!不过还是没想出来,如何进行大小无限制,断点续传。例如断电,断网,中断传输的问题!
      

  36.   

    1,断线续传;
    2,传大文件
    此两点BS是不能更好的解决,建议楼主使用ActiveX来做,虽然是CS结构的,按照一个IE插件不麻烦,第一次安装好后就不需要再安装了,楼主可以看看QQ邮箱的中转站功能,还有网易相册,可以非常好的解决这个2个问题,而且可以对后续一些功能进行扩展的!
    强烈建议楼主考虑ActiveX!
      

  37.   

    决定暂用Flash那个上传组件。最简便。
    如果性能不够,再开发ActiveX解决。谢谢大家参与。结贴。
      

  38.   

    很想知道Javascript+xmlhttp调用Webservice的资料方法可否给写代码或思路