.NET两种常见上传下载文件方法

1.FTP模式

代码如下:

(1)浏览

       /// <summary>
        /// 浏览文件
        /// </summary>
        /// <param name="tbControl">控件名称</param>
        private void ViewFile(TextBox tbControl) 
        {
            OpenFileDialog openFileDialogTemp = new OpenFileDialog();//提示用户打开文件弹窗

            //设置文件类型  
            string filterStr = "";//文件类型过滤
            int fileLength = 100 * 1024 * 1024;//文件大小限制(1M = 1024KB = 1024*1024字节)
            string fileLenDes = "100M";//文件大小描述,默认100M
            switch (tbControl.Name)//根据控件名称判断过滤字符串
            {
                case "txtTemplatePath"://模板
                    filterStr = "All files(*.*)|*.*";
                    break;
                case "txtCusSoftwarePath"://定制软件
                    filterStr = "All files(*.*)|*.*";
                    break;
                default://检查清单
                    filterStr = "Word或Excel文件(*.doc,*.docx,*.xls,*.xlsx,*.wps,*.et)|*.doc;*.docx;*.xls;*.xlsx;*.wps;*.et;";
                    break;
            }
            openFileDialogTemp.Filter = filterStr;

            DialogResult dr = openFileDialogTemp.ShowDialog();//弹窗返回值
            if (dr == DialogResult.OK)
            {
                //获取用户选择的文件
                FileInfo fileInfo = new FileInfo(openFileDialogTemp.FileName);
                if (fileInfo.Length > fileLength)//判断文件大小是否超出限制
                {
                    this.MessageShow("上传文件不能大于" + fileLenDes);
                    return;
                }

                tbControl.Text = openFileDialogTemp.FileName;
            }
        }

(2)上传

        // 定制软件上传
        private void btnCusSoftwareUpload_Click(object sender, EventArgs e)
        {
            if (txtStatus.Text.Trim() != "实施中")
            {
                this.MessageShow("该任务不在实施中,不能进行此操作,请确认");
                return;
            }

            bool result = UpLoadFile(txtCusSoftwarePath);//代码在下面
            if (result == true)
            {
                txtCusSoftwareName.Text = Path.GetFileName(txtCusSoftwarePath.Text);//更新定制软件名称
            }
        }

        /// <summary>
        /// 上传文件
        /// </summary>
        /// <param name="tbControl">控件名称</param>
        /// <returns>是否上传成功</returns>
        private bool UpLoadFile(TextBox tbControl)
        {
            bool resFlag = false;
            try
            {
                this.Cursor = Cursors.WaitCursor;//光标等待

                string filePath = tbControl.Text.Trim();//文件路径
                if (string.IsNullOrEmpty(filePath))
                {
                    MessageShow("没有可上传的文件");
                    return resFlag;
                }

                ////判断远程服务器中是否存在该文件(由于删除动作并没有删除服务器中的文件,所以如果某文件上传后被删除再上传就会出现无法上传的情况)
                //if (FileIsExist(mFtpFullPath + Path.GetFileName(filePath)) == true) 
                //{
                //    this.MessageShow("远程服务器中已经存在该文件,请勿重复上传!");
                //    return resFlag;
                //}

                Upload(filePath, mFtpFullPath, mFtpUserId, mFtpPassword);//代码在下面

                //保存文件
                //说明:BARCODE.PDM_PACK_IMAGES表是存上传文件的表,其中PD_ID字段是对应需要上传的表的主键,IMAGES字段是文件上传到ftp的完全路径
                int saveRecordID = SaveUploadFile(filePath);//保存在本地表的主键id
                mSavePathID = saveRecordID;
                int tIndex;//临时变量,用来区分保存类型
                if (saveRecordID > 0)//保存文件成功
                {                    
                    //本地表中保存上传文件的ftp表记录ID
                    Hashtable ht = new Hashtable();
                    string FileName = Path.GetFileName(filePath);//文件名称
                    switch (tbControl.Name)//文件保存路径(存的是保存表的记录id)
                    {
                        case "txtCusSoftwarePath"://定制软件上传
                            ht.Add("CusSoftwarePath", saveRecordID.ToString());
                            ht.Add("CusSoftwareName", FileName);

                            mChoosedLabelRow["CUS_SOFTWARE_PATH"] = saveRecordID.ToString();//更新内存中的模板地址
                            tIndex = 2;
                            break;
                        default://检查清单上传
                            ht.Add("CheckListPath", saveRecordID.ToString());
                            ht.Add("CheckListName", FileName);

                            mChoosedLabelRow["CHECK_LIST_PATH"] = saveRecordID.ToString();//更新内存中的模板地址
                            tIndex = 3;
                            break;
                    }

                    int result = UpdateDatas(ht);//执行更新
                    if (result > 0)
                    {
                        resFlag = true;
                        switch (tIndex) //更新临时变量中的模板地址
                        {
                            case 1:
                                mTemplatePath = GetFileSavePath(tIndex, mLableID, saveRecordID.ToString());
                                break;
                            case 2:
                                mCustomSoftwarePath = GetFileSavePath(tIndex, mLableID, saveRecordID.ToString());
                                break;
                            default:
                                mCheckListPath = GetFileSavePath(tIndex, mLableID, saveRecordID.ToString());
                                break;
                        }                        
                    }

                }//if (saveRecordID > 0) end
            }//try end
            catch (Exception ex)
            {
                ErrorCommand(ex);
            }
            finally
            {
                this.Cursor = Cursors.Default;
            }
            return resFlag;
        }

        /// <summary>
        /// ftp上传
        /// </summary>
        /// <param name="fileName">客户端上传文件名称</param>
        /// <param name="ftpFullPath">ftp完整路径,例如 ftp://10.18.178.154/mes_upload/ManuNotice/P108A5/126708201002/label/ </param>
        /// <param name="ftpUserId">ftp登陆用户名</param>
        /// <param name="ftpPassword">ftp登陆密码</param>
        public static void Upload(string fileName, string ftpFullPath, string ftpUserId, string ftpPassword)
        {
            FileInfo fileInf = new FileInfo(fileName);//--using System.IO;
            string uri = ftpFullPath + fileInf.Name;
            FtpWebRequest reqFTP;//--using System.Net;

            // 根据uri创建FtpWebRequest对象 
            reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(uri));//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();

            }
            catch (Exception)
            {

            }
            finally
            {
                fs.Close();
            }

        }//function end

 注意,上传下载地址可以放在配置文件中取,例如:

后台取数据:

 ms.Url = System.Configuration.ConfigurationSettings.AppSettings["GetAccessoryPathForMes"].ToString();//ftp地址WebService
 ftpUserId = System.Configuration.ConfigurationSettings.AppSettings["FtpUserId"].ToString(); //ftp登陆账号
 ftpPassword = System.Configuration.ConfigurationSettings.AppSettings["FtpPassword"].ToString(); //ftp登陆密码
 



(3)下载

        /// <summary>
        /// 下载文件
        /// </summary>
        /// <param name="tbControl">控件名称</param>
        private void DownLoadFile(TextBox tbControl) 
        {
            try
            {
                this.Cursor = Cursors.WaitCursor;

                string localFilePath = String.Empty;
                SaveFileDialog saveFileDialog = new SaveFileDialog();

                //设置文件相关信息
                string filterStr = "";//过滤文件类型字符串
                string filePathStr = "";//路径
                switch (tbControl.Name)//根据控件名称判断过滤字符串
                {
                    case "txtTemplatePath":
                        filterStr = "All files(*.*)|*.*";
                        filePathStr = mTemplatePath;
                        break;
                    case "txtCusSoftwarePath":
                        filterStr = "All files(*.*)|*.*";
                        filePathStr = mCustomSoftwarePath;
                        break;
                    default:
                        filterStr = "Word或Excel文件|*.doc;*.docx;*.xls;*.xlsx;*.wps;*.et;";
                        filePathStr = mCheckListPath;
                        break;
                }
                saveFileDialog.Filter = filterStr;

                //设置文件名称:
                string filePath = filePathStr;

                //下载的文件名称为空时return
                if (string.IsNullOrEmpty(filePath)) 
                {
                    this.MessageShow("找不到当前文件存储路径");
                    return;
                }               
                string fileName = Path.GetFileName(filePath);//获取文件名和扩展名
                saveFileDialog.FileName = fileName;

                //设置默认文件类型显示顺序  
                saveFileDialog.FilterIndex = 1;

                //保存对话框是否记忆上次打开的目录  
                saveFileDialog.RestoreDirectory = true;

                //点了保存按钮进入  
                if (saveFileDialog.ShowDialog() == DialogResult.OK)
                {
                    //获得文件路径  
                    localFilePath = saveFileDialog.FileName.ToString();

                    PublicMethod.Download(localFilePath, filePath, mFtpUserId, mFtpPassword);
                }
            }
            catch (Exception ex)
            {
                ErrorCommand(ex);//异常处理
            }
            finally
            {
                this.Cursor = Cursors.Default;
            }
        }

        /// <summary>
        /// ftp下载
        /// </summary>
        /// <param name="clientFilePath">下载保存的客户端完整路径</param>
        /// <param name="fullPath">ftp完整文件路径及文件名</param>
        /// <param name="ftpUserId">ftp登陆用户</param>
        /// <param name="ftpPassword">ftp登陆密码</param>
        public static void Download(string clientFilePath, string fullPath, string ftpUserId, string ftpPassword)
        {
            string dFileName = Path.GetFileName(fullPath);

            string rootPath = fullPath.Substring(0, fullPath.LastIndexOf("/")) + "/";

            //定义FTP请求对象
            FtpWebRequest reqFTP = null;
            //定义FTP响应对象
            FtpWebResponse response = null;
            //存储流
            FileStream outputStream = null;
            //FTP数据流
            Stream ftpStream = null;

            try
            {
                //生成下载文件
                outputStream = new FileStream(clientFilePath, FileMode.Create);

                //生成FTP请求对象
                reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(rootPath + dFileName));

                //设置登录FTP帐号和密码
                reqFTP.Credentials = new NetworkCredential(ftpUserId, ftpPassword);

                //默认为True,连接不会被关闭
                //在一个命令之后执行
                reqFTP.KeepAlive = false;

                //设置下载文件方法
                reqFTP.Method = WebRequestMethods.Ftp.DownloadFile;

                //设置文件传输类型
                reqFTP.UseBinary = true;

                //生成FTP响应对象
                response = (FtpWebResponse)reqFTP.GetResponse();

                //获取FTP响应流对象
                ftpStream = response.GetResponseStream();

                //响应数据长度
                long cl = response.ContentLength;

                int bufferSize = 2048;

                int readCount;

                byte[] buffer = new byte[bufferSize];

                //接收FTP文件流
                readCount = ftpStream.Read(buffer, 0, bufferSize);

                while (readCount > 0)
                {
                    outputStream.Write(buffer, 0, readCount);

                    readCount = ftpStream.Read(buffer, 0, bufferSize);
                }
            }
            catch (Exception)
            {
                //MessageShow(ex.ToString());
            }
            finally
            {
                if (ftpStream != null)
                {
                    ftpStream.Close();
                }

                if (outputStream != null)
                {
                    outputStream.Close();
                }

                if (response != null)
                {
                    response.Close();
                }
            }
        }

(由于时间关系很多细节没有处理,这只是工作中的一个摘抄,不详之处还请原谅。)

2.文件流模式

        /// <summary>
        /// 来料设计稿/标贴设计稿下载
        /// </summary>
        /// <param name="btnID">0代表来料设计稿,1代表标贴设计稿</param>
        private void DownLoadDesignDraft(int btnID)
        {
            try
            {
                this.Cursor = Cursors.WaitCursor;//设置光标等待

                #region 获取下载文件所需相关信息

                string webUrl = string.Empty;//下载地址
                string[] tempArray = null;//临时数组(数据库中的来料设计稿ID和名称是放一起的,格式如“id|name”)
                string backFileName = string.Empty;//如果文件名称不存在就临时创建一个名称
                string onlyID = string.Empty;//下载接口对应的唯一id
                string fileName = string.Empty;//下载文件的名称

                if (btnID == 0)//来料设计稿
                {
                    tempArray = mChoosedLabelRow["INCOMINGFILE"].ToString().Trim().Split('|');
                    //backFileName = "标贴类任务维护来料设计稿" + DateTime.Now.ToString("yyyyMMddhhmmssfff");
                }
                else //标贴设计稿
                {
                    tempArray = mChoosedLabelRow["LABELFILE"].ToString().Trim().Split('|');
                    //backFileName = "标贴类任务维护标贴设计稿" + DateTime.Now.ToString("yyyyMMddhhmmssfff");
                }

                if (tempArray != null && tempArray.Length > 1)
                {
                    onlyID = tempArray[0].ToString();  //下载接口对应的唯一id
                    fileName = tempArray[1].ToString();//下载文件的名称

                    if (onlyID == "" || fileName == "") 
                    {
                        this.MessageShow("下载文件ID或文件名称不存在,请确认");
                        return;
                    }

                    //fileName = fileName.Replace(".xlsx", "").Replace(".xls", "") + ".xlsx";//添加文件后缀

                    // 从配置文件中取地址,地址例如:http://10.5.4.28/PDM_Eai/EaiService/ProdName/PDM_M00_AttachFileStreamSrv.aspx
                    webUrl = System.Configuration.ConfigurationSettings.AppSettings["LabelTypeTaskManage_DownloadAddress"].ToString();
                    if (webUrl == "") 
                    {
                        this.MessageShow("找不到文件的下载地址");
                        return;
                    }

                }//if (tempArray != null && tempArray.Length > 1) end
                else
                {
                    this.MessageShow("没有可以下载的文件");
                    return;
                }

                #endregion

                SaveFileDialog saveDialog = new SaveFileDialog();//保存文件对话框,--using System.Windows.Forms;
                //saveDialog.Filter = "All files(*.xls,*.xlsx)|*.xls;*.xlsx";//设置文件类型
                saveDialog.Filter = "All files|*.*";//设置文件类型
                saveDialog.FileName = fileName;//设置文件名称
                saveDialog.FilterIndex = 1;//设置默认文件类型显示顺序
                saveDialog.RestoreDirectory = true; //保存对话框是否记忆上次打开的目录  
                string localFilePath = String.Empty;//下载文件的本地保存地址

                //点了保存按钮进入  
                if (saveDialog.ShowDialog() == DialogResult.OK)
                {
                    //获得文件路径  
                    localFilePath = saveDialog.FileName.ToString();

                    //开始下载
                    HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(webUrl + "?id=" + onlyID);--using System.Net;
                    HttpWebResponse wr = (HttpWebResponse)req.GetResponse();--using System.Net;
                    Stream responseStream = wr.GetResponseStream();--using System.IO;
                    StreamReader reader = new StreamReader(responseStream);--using System.IO;

                    FileStream fs = new FileStream(@"" + localFilePath, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.None);
                    int iBufferSize = 1024;//响应长度
                    byte[] byteFileBlock = new byte[iBufferSize];
                    int bytesRead = 0;
                    while (true)
                    {
                        bytesRead = responseStream.Read(byteFileBlock, 0, iBufferSize);

                        if (bytesRead == 0)
                        {
                            break;
                        }
                        fs.Write(byteFileBlock, 0, bytesRead);
                    }
                }

            }//try end
            catch (Exception ex)
            {
                ErrorCommand(ex);
            }
            finally
            {
                this.Cursor = Cursors.Default;
            }
            
        }//function end
原文地址:https://www.cnblogs.com/programsky/p/4310381.html