1.FTP模式

代码如下:

(1)浏览

       /// <summary>
/// 浏览文件
/// </summary>
/// <param name="tbControl">控件名称</param>
private void ViewFile(TextBox tbControl)
{
OpenFileDialog openFileDialogTemp = new OpenFileDialog();//提示用户打开文件弹窗 //设置文件类型
string filterStr = "";//文件类型过滤
int fileLength = * * ;//文件大小限制(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 > )//保存文件成功
{
//本地表中保存上传文件的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 = ;
break;
default://检查清单上传
ht.Add("CheckListPath", saveRecordID.ToString());
ht.Add("CheckListName", FileName); mChoosedLabelRow["CHECK_LIST_PATH"] = saveRecordID.ToString();//更新内存中的模板地址
tIndex = ;
break;
} int result = UpdateDatas(ht);//执行更新
if (result > )
{
resFlag = true;
switch (tIndex) //更新临时变量中的模板地址
{
case :
mTemplatePath = GetFileSavePath(tIndex, mLableID, saveRecordID.ToString());
break;
case :
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 = ; byte[] buff = new byte[buffLength];
int contentLen; // 打开一个文件流 (System.IO.FileStream) 去读上传的文件
FileStream fs = fileInf.OpenRead();
try
{
// 把上传的文件写入流
Stream strm = reqFTP.GetRequestStream(); // 每次读文件流的2kb
contentLen = fs.Read(buff, , buffLength); // 流内容没有结束
while (contentLen != )
{
// 把内容从file stream 写入 upload stream
strm.Write(buff, , contentLen); contentLen = fs.Read(buff, , 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 = ; //保存对话框是否记忆上次打开的目录
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(, 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 = ; int readCount; byte[] buffer = new byte[bufferSize]; //接收FTP文件流
readCount = ftpStream.Read(buffer, , bufferSize); while (readCount > )
{
outputStream.Write(buffer, , readCount); readCount = ftpStream.Read(buffer, , 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 == )//来料设计稿
{
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 > )
{
onlyID = tempArray[].ToString(); //下载接口对应的唯一id
fileName = tempArray[].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 = ;//设置默认文件类型显示顺序
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 = ;//响应长度
byte[] byteFileBlock = new byte[iBufferSize];
int bytesRead = ;
while (true)
{
bytesRead = responseStream.Read(byteFileBlock, , iBufferSize); if (bytesRead == )
{
break;
}
fs.Write(byteFileBlock, , bytesRead);
}
} }//try end
catch (Exception ex)
{
ErrorCommand(ex);
}
finally
{
this.Cursor = Cursors.Default;
} }//function end

.NET两种常见上传下载文件方法的更多相关文章

  1. MVC两种获取上传的文件数据变量的方式

    第一种方式,在控制器中利用HttpPostedFileBase参数对象获取. [HttpPost] public ActionResult SaveFile(HttpPostedFileBase up ...

  2. egg.js 通过 form 和 ajax 两种方式上传文件并自定义目录和文件名

    egg.js 通过 form 和 ajax 两种方式上传文件并自定义目录和文件名 评论:10 · 阅读:8437· 喜欢:0 一.需求 二.CSRF 校验 三.通过 form 表单上传文件 四.通过 ...

  3. 上传下载文件到Linux服务器

    转自链接:https://blog.csdn.net/drdongshiye/article/details/89430535Mac的终端是十分强大 , 可以通过命令进行上传下载下载文件夹 scp - ...

  4. linux下常用FTP命令 上传下载文件【转】

    1. 连接ftp服务器 格式:ftp [hostname| ip-address]a)在linux命令行下输入: ftp 192.168.1.1 b)服务器询问你用户名和密码,分别输入用户名和相应密码 ...

  5. 向linux服务器上传下载文件方式收集

    向linux服务器上传下载文件方式收集 1. scp [优点]简单方便,安全可靠:支持限速参数[缺点]不支持排除目录[用法] scp就是secure copy,是用来进行远程文件拷贝的.数据传输使用 ...

  6. SecureCRT上传下载文件教程(Zmodem使用教程)

    SecureCRT是一个仿真终端连接工具.它可以方便的连接SSH服务器,远程管理Linux.同时,它还能使用多种协议方便的上传下载文件.其中Zmodem是SecureCRT支持比较好的一种古老的上传下 ...

  7. SecureCRT、Xmanager对Linux上传下载文件或文件夹

    (1).SecureCRT SecureCRT对Linux上传下载文件或文件夹拥有一个专门的软件SecureFXPortable.对于它来说只有两个的难题,一个是版本问题,尽量去官网下载最近版本:另一 ...

  8. 【WCF】利用WCF实现上传下载文件服务

    引言     前段时间,用WCF做了一个小项目,其中涉及到文件的上传下载.出于复习巩固的目的,今天简单梳理了一下,整理出来,下面展示如何一步步实现一个上传下载的WCF服务. 服务端 1.首先新建一个名 ...

  9. WebSSH画龙点睛之lrzsz上传下载文件

    本篇文章没有太多的源码,主要讲一下实现思路和技术原理 当使用Xshell或者SecureCRT终端工具时,我的所有文件传输工作都是通过lrzsz来完成的,主要是因为其简单方便,不需要额外打开sftp之 ...

随机推荐

  1. JVM——类加载器的双亲委派模型

    类加载器双亲委派模型,如下图所示: 双亲委派模型的工作过程 如果一个类加载器收到了类加载的请求,它首先不会自己去尝试加载这个类,而是把这个请求委派给父类加载器去完成,每一个层次的类加载器都是如此,因此 ...

  2. redmine 2.5.2 安装后邮件无法发送

    找到redmine安装目录-apps->redmine->htdocs->conflg->configuration.yml email_delivery:    delive ...

  3. 小结JS中的OOP(下)

    关于JS中OOP的具体实现,许多大神级的JS专家都给出了自己的方案. 一:Douglas Crockford 1.1 Douglas Crockford实现的类继承 /** * 原文地址:http:/ ...

  4. jvm调优之四:生产环境参数实例及分析【生产环境实例增加中】

    java application项目(非web项目) 改进前: -Xms128m-Xmx128m-XX:NewSize=64m-XX:PermSize=64m-XX:+UseConcMarkSweep ...

  5. 对JAVA集合进行遍历删除时务必要用迭代器

    java集合遍历删除的方法: 1.当然这种情况也是容易解决,实现方式就是讲遍历与移除操作分离,即在遍历的过程中,将需要移除的数据存放在另外一个集合当中,遍历结束之后,统一移除. 2.使用Iterato ...

  6. Selenium2Library系列 keywords 之 _SelectElementKeywords 之 unselect_from_list_by_label(self, locator, *labels)

    def unselect_from_list_by_label(self, locator, *labels): """Unselects `*labels` from ...

  7. PHP 获取网页301|302真实地址

    function getRealURL($url){ $header = get_headers($url,1); if (strpos($header[0],'301') || strpos($he ...

  8. vector容器总结.xml

    1 清空所有元素     m_itemVector.clear();   2 遍历     vector<ITEM_CHECK>::iterator iter=m_itemVector.b ...

  9. 将Tomcat注册为Windows服务

    1.从官网http://tomcat.apache.org/下载Tomcat. 2.将Tomcat压缩文件解压到相应的路径下(例如E:\TomcatServer) 3.从bin目录下找到service ...

  10. shell语句记录-awk

    cat ./daily_uv/daily_uv_20140104 | awk '{fr[$1]+=$3; k=$1 "_" $2; av[k]+=$3;} END{for (k i ...