CS结构下怎么上传文件到服务器(文件保存在指定目录下,数据库记录地址),客户端怎么打开文件。

解决方案 »

  1.   

    在服务器端做一个service,来跟客户端通讯啊,上传下载都可以,也安全,也省力。
      

  2.   

    在服务器端做一个service,来跟客户端通讯啊
      

  3.   

    服务器端装iis,然后用WebClient 这个对象来上传。
    客户端下载文件可以用WebRequest,WebResponse来做。
      

  4.   

    使用webservice吧
    打开的话,应该去下载服务器端的文件到本地,然后打开。
      

  5.   

    我还是那句老话。虽然大家都没听过。简单点···直接File.copy() 如果参数是远程路径,那么可以直接远程拷贝过去,哪需要那么复杂?
      

  6.   

    private void Upload(string filename)
    {
        FileInfo fileInf = new FileInfo(filename);
        string uri = "ftp://" + ftpServerIP + "/" + fileInf.Name;
        FtpWebRequest reqFTP;    // 根据uri创建FtpWebRequest对象
        reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri("ftp://" + ftpServerIP + "/" + fileInf.Name));    // ftp用户名和密码
        reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword);    // 默认为true,连接不会被关闭
        // 在一个命令之后被执行
        reqFTP.KeepAlive = false;    // 指定执行什么命令
        reqFTP.Method = WebRequestMethods.Ftp.UploadFile;    // 指定数据传输类型
        reqFTP.UseBinary = true;    // 上传文件时通知服务器文件的大小
        reqFTP.ContentLength = fileInf.Length;    // 缓冲大小设置为2kb
        int buffLength = 2048;    byte[] buff = new byte[buffLength];
        int contentLen;    // 打开一个文件流 (System.IO.FileStream) 去读上传的文件
        FileStream fs = fileInf.OpenRead();
        try
        {
            // 把上传的文件写入流
            Stream strm = reqFTP.GetRequestStream();        // 每次读文件流的2kb
            contentLen = fs.Read(buff, 0, buffLength);        // 流内容没有结束
            while (contentLen != 0)
            {
                // 把内容从file stream 写入 upload stream
                strm.Write(buff, 0, contentLen);            contentLen = fs.Read(buff, 0, buffLength);
            }        // 关闭两个流
            strm.Close();
            fs.Close();
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message, "Upload Error");
        }
    }
    //以上代码简单的示例了ftp的上传功能。创建一个指向某ftp服务器的FtpWebRequest对象,然后设置其不同的属性Credentials,KeepAlive,Method,UseBinary,ContentLength。//打开本地机器上的文件,把其内容写入ftp请求流。缓冲的大小为2kb,无论上传大文件还是小文件,这都是一个合适的大小。private void Download(string filePath, string fileName)
    {
        FtpWebRequest reqFTP;    try
        {
            FileStream outputStream = new FileStream(filePath + "\\" + fileName, FileMode.Create);        reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri("ftp://" + ftpServerIP + "/" + fileName));        reqFTP.Method = WebRequestMethods.Ftp.DownloadFile;        reqFTP.UseBinary = true;        reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword);        FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();        Stream ftpStream = response.GetResponseStream();        long cl = response.ContentLength;        int bufferSize = 2048;        int readCount;        byte[] buffer = new byte[bufferSize];        readCount = ftpStream.Read(buffer, 0, bufferSize);        while (readCount > 0)
            {
                outputStream.Write(buffer, 0, readCount);            readCount = ftpStream.Read(buffer, 0, bufferSize);
            }        ftpStream.Close();        outputStream.Close();        response.Close();
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
    }
      

  7.   

    上传带进度条已经实现,但是下载的时候带进度条这么实现呢?
    用long cl = response.ContentLength; 这里我跟踪了一下,值却是-1。
    另开一贴
    http://topic.csdn.net/u/20081211/10/8a2b858f-f5d2-4e32-891d-604a2941acab.html?seed=357418522
      

  8.   

    获取FTP上指定文件的大小得单独写的,完整的FTP下载代码:
    #region FTP下载带进度条
            /// <summary>
            /// FTP下载带进度条
            /// </summary>
            /// <param name="filePath">下载到客户端的地址</param>
            /// <param name="fileName">FTP上对应的文件名</param>
            /// <returns></returns>
            private bool FtpDownload(string filePath, string fileName)
            {
                this.lbl_ftpStakt.Text = "连接服务器中...";
                FtpWebRequest reqFTP;
                try
                {
                    //打开一个文件流 (System.IO.FileStream) 去读要下载的文件
                    FileStream outputStream = new FileStream(filePath + "\\" + fileName, FileMode.Create);                reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri("ftp://" + ftpServerIP + "/" + fileName));
                    // ftp用户名和密码
                    reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword);
                    // 指定执行什么命令
                    reqFTP.Method = WebRequestMethods.Ftp.DownloadFile;
                    // 指定数据传输类型
                    reqFTP.UseBinary = true;
                    
                    FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();                                Stream ftpStream = response.GetResponseStream();
                    //这里其实娶不到FTP上该文件的大小,应另写方法来获取(WebRequestMethods.Ftp.GetFileSize)
                    //long cl = response.ContentLength;
                    // 缓冲大小设置为2kb
                    int bufferSize = 8192;// 4096;// 2048; //局域网内可以放大点                int readCount;                byte[] buffer = new byte[bufferSize];                readCount = ftpStream.Read(buffer, 0, bufferSize);
                    //FTP上文件的大小
                    int allbye = this.GetFtpFileSize(fileName);
                    int startbye = 0;
                    this.myProgressControl.Maximum = allbye;
                    this.myProgressControl.Minimum = 0;
                    this.myProgressControl.Visible = true;
                    this.lbl_ftpStakt.Visible = true;
                    // 流内容没有结束
                    while (readCount > 0)
                    {
                        // 把内容从file stream 写入 DownLoadStream
                        outputStream.Write(buffer, 0, readCount);                    readCount = ftpStream.Read(buffer, 0, bufferSize);
                        //
                        startbye += readCount;
                        this.lbl_ftpStakt.Text = "已下载:" + (int)(startbye / 1024) + "KB/" + "总长度:" + (int)(allbye / 1024) + "KB" + " " + " 文件名:" + fileName;
                        myProgressControl.Value = startbye;
                        Application.DoEvents();
                        Thread.Sleep(5);
                    }
                    this.myProgressControl.Visible = false;
                    this.lbl_ftpStakt.Text = "下载成功!";
                    ftpStream.Close();
                    outputStream.Close();
                    response.Close();
                    return true;
                    
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                    return false;
                }
                finally
                {
                }
            }
            #endregion
    #region 获取FTP服务器上指定文件的大小
            /// <summary>
            /// 获取FTP服务器上指定文件的大小
            /// </summary>
            /// <param name="fileName">FTP服务器上的文件名</param>
            /// <returns></returns>
            private int GetFtpFileSize(string fileName)
            {
                FtpWebRequest reqFTP;
                int fileSize = 0;
                try
                {
                    reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri("ftp://" + ftpServerIP + "/" + fileName));                reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword);                reqFTP.Method = WebRequestMethods.Ftp.GetFileSize;                reqFTP.UseBinary = true;
                    FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();
                    Stream ftpStream = response.GetResponseStream();
                    fileSize = (int)response.ContentLength;                ftpStream.Close();
                    response.Close();
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
                return fileSize;
            }
            #endregion