zoukankan      html  css  js  c++  java
  • .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
  • 相关阅读:
    简简单单制作鼠标静态动态 ani cur 小结 鼠标形状指针
    【VB6 学习文档管理系统源码】
    Delphi 中的全局快捷键+给指定窗体发送按键
    C# 委托实例实现的多种类型
    PyCharm 上传项目到码云托管平台
    vs rdlc 设置Tablix 在新页面重复表头
    .net C# Chart控件的简单使用
    发邮件,阿里云,未指定邮件服务器端口导致的报错
    使用Quartz Job 简单的做一个定时服务
    FromBase64String 输入的不是有效的 Base-64 字符串,因为它包含非 Base-64 字符、两个以上的填充字符,或者填充字符间包含非法字符
  • 原文地址:https://www.cnblogs.com/programsky/p/4310381.html
Copyright © 2011-2022 走看看