[Asp.Net]最近一个项目的总结
引言
项目到目前告一段落,目前进入测试阶段,下周就要去部署了。虽然项目不大,但是从头到尾都是自己一个人负责,在完成编码之后,对代码进行走查,命名规范,业务逻辑,代码优化等,能负责一个项目的整个编码,非常的兴奋啊。
技术
用到的技术:
技术 | 项目中使用该技术目的 |
ASP.NET | 使用asp.net进行web端用户信息管理,对用户的增删改查,对签名样本的上传,下载Excel模版,导入用户信息。 |
webService | 为签名客户端提供修改用户密码接口服务,下载签名样本接口服务, |
windows服务 | 轮询数据库,对满足条件的dwg文件,从ftp服务器下载dwg文件至c盘缓存,获取签名样本文件,调用c++签名接口,对dwg文件进行签名。 |
ftp | 使用serv-u进行ftp服务器搭建,对dwg文件进行上传下载。serv-u配置教程。[工具]Serv-U配置教程 |
jquery | 使用ajax对用户信息的无刷新校验,主要用在登录页面,添加用户页面对信息的校验。 |
js | 回车键触发登录事件。 |
jqueryui | 上传前面样本,excel人员信息excel文件的弹出框。 |
uploadify上传组件 | 上传.sign文件和.xlsx文件。 |
NHibernate |
对象/关系数据库映射工具 |
多层 |
IData:数据库操作接口 Data:数据库操作类 Business:业务逻辑层 Domain:简单领域层,包括Entities(数据库映射实体类)和Mapping(NHibernate映射xml文件) Ui:人员信息管理web端 |
NHibernate |
对象/关系数据库映射工具 |
NPOI |
项目中用到com组件进行读取excel的,但是测试的时候,在x64系统上读取不了,没办法采用了NPOI组件。 |
AspNetPager |
对人员列表进行分页。 |
工具
工具 | 目的 |
VS2012 | 代码编写 |
动软代码生成器 | 根据NHibernate模版生成IData,Data,Business,Entities,Mapping代码生成 |
Serv-U | ftp服务器搭建 |
SqlServer2012 |
数据库 |
windows server2008 | 服务器环境虚拟机,测试用 |
Dependency Walker | 查看dll依赖,
[工具]推荐一款查看dll依赖工具 |
web端界面
该项目,为管理员使用,类似一个简单的管理工具。对样式要求不高就从网上找了一个样式,扒取的样式。
登录界面:
页面主要代码:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Login.aspx.cs" Inherits="PYC.SignatureNX.Login" %> <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>登录</title>
<link href="CSS/admin_login.css" rel="stylesheet" />
<script type="text/javascript" src="Scripts/jquery-1.10.2.js"></script>
<script type="text/javascript">
$(function () {
//页面加载,用户名文本框获得焦点
$("#txtCode").focus();
//密码框获得焦点,断用户是否存在
$("#txtPwd").focus(function () {
var strCode = $("#txtCode").val();
if (strCode == "") {
alert("请输入用户名");
$("#txtCode").focus();
return;
} else {
AjaxRequest(strCode, "", "Exist");
} });
//单击登录按钮,验证密码是否存在,存在则登录,不存在重新输入用户密码
$("#btnLogin").click(function () {
var strCode = $("#txtCode").val();
var strPwd = $("#txtPwd").val();
if (strCode == "") {
alert("请输入用户名");
return;
} else if (strPwd == "") {
alert("请输入密码");
return;
} else {
AjaxRequest(strCode, strPwd, "SignIn");
} }); });
//ajax请求,验证用户名,密码
function AjaxRequest(code, pwd, method) {
//拼接参数
var strData = "strCode=" + code
if (pwd != "") {
strData += "&strPwd=" + pwd;
}
$.ajax({
type: "POST",
url: "Ashx/Login.ashx?action=" + method,
data: strData,
contentType: "application/x-www-form-urlencoded",
dataType: "text",
success: function (data) {
if (data == "-1") {
alert("该用户不存在,请重新输入");
$("#txtCode").val("");
$("#txtCode").focus();
return false;
} else if (data == "0") {
alert("密码不正确,请重新输入");
$("#txtPwd").val("");
$("#txtPwd").focus();
return false;
} else if (data == "1") {
window.location.href = "Main.aspx";
}
},
//参数:XMLHttpRequest 对象、错误信息、(可选)捕获的异常对象。
error: function (XMLHttpRequest, textStatus, errorThrown) {
//请求失败,弹出错误状态码
alert(textStatus);
}
});
}
</script>
<script type="text/javascript">
//回车触发登录事件
function keyLogin() {
//获得用户名和密码
var strCode = $("#txtCode").val();
var strPwd = $("#txtPwd").val();
//如果按下回车键,此时用户名为空,则提示,用户名文本框获得焦点,并阻止提交
if (event.keyCode == 13 && strCode == "") {
alert("请输入用户名");
$("#txtCode").val("");
$("#txtCode").focus();
return;
} else if (event.keyCode == 13 && strPwd == "") {
//如果按下回车键,此时密码为空,则提示,密码文本框获得焦点,并阻止提交
alert("请输入密码");
$("#txtPwd").val("");
$("#txtPwd").focus();
return;
}
//如果按下回车键,并且用户名和密码都不为空,触发登录按钮的单击事件,进行提交验证
if (event.keyCode == 13 && strCode != "" && strPwd != "") //回车键的键值为13
document.getElementById("btnLogin").click(); //调用登录按钮的登录事件
}
</script>
</head>
<body onkeyup="keyLogin();">
<form id="form1" runat="server">
<div class="admin_login_wrap">
<h1>系统登录窗口</h1>
<div class="adming_login_border">
<div class="admin_input"> <ul class="admin_items">
<li>
<label for="user">用户名:</label>
<input type="text" name="txtCode" value="" id="txtCode" size="40" class="admin_input_style" />
</li>
<li>
<label for="pwd">密码:</label>
<input type="password" name="txtPwd" value="" id="txtPwd" size="40" class="admin_input_style" />
</li>
<li>
<input type="button" tabindex="3" id="btnLogin" value="登录" class="btn btn-primary" />
</li>
</ul> </div>
</div>
</div> </form>
</body>
</html>
Login.aspx
业务逻辑:用户名失去焦点时,进行用户名是否存在。使用ajax进行无刷新登录。
人员信息模版:
人员信息列表页面:
导入过程:
结果:
上传签名人样本:
单击人员列表中的上传,弹出上传签名样本的窗口。
页面主要代码:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Main.aspx.cs" Inherits="PYC.SignatureNX.Main" %> <!DOCTYPE html>
<%@ Register Assembly="AspNetPager" Namespace="Wuqi.Webdiyer" TagPrefix="webdiyer" %>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>用户信息</title>
<link href="CSS/common.css" rel="stylesheet" />
<link href="CSS/main.css" rel="stylesheet" />
<style type="text/css">
/*隐藏上传的进度条*/
.uploadify-queue
{
display: none;
}
/*查询框中灰色字体样式*/
.search
{
color: gray;
}
</style>
<script type="text/javascript" src="Scripts/jquery-1.10.2.js"></script>
<link href="Scripts/uploadify/css/uploadify.css" rel="stylesheet" />
<script type="text/javascript" src="Scripts/uploadify/js/uploadify3.2.1/jquery.uploadify.js"></script>
<link href="Scripts/JqueryUI/css/redmond/jquery-ui-1.10.4.custom.css" rel="stylesheet" />
<script type="text/javascript" src="Scripts/JqueryUI/js/jquery-ui-1.10.4.custom.js"></script>
<script type="text/javascript">
$(function () {
//初始化批量导入弹出框
OpenDialog("dialogxls", "上传批导人员信息", false); //初始化dialog
OpenDialog("dialog", "上传签名样本", true);
});
function OpenDialog(id, title, isContainsUpload) {
//弹出框的初始化方法
$("#" + id).dialog({ // 初始化之后,是否立即显示对话框,默认为 true
autoOpen: false, //设置弹出框的高度 400px
width: 400, //是否模式对话框,默认为 false
modal: true, //是否允许拖动,默认为 true
draggable: true, //是否可以调整对话框的大小,默认为 true
resizable: true, //弹出框的标题
title: title,
position: "center",
close: function () {
if (isContainsUpload == true) {
//注意jquery下检查一个元素是否存在必须使用 .length >0 来判断
if ($('#btnUpload').length > 0) {
//如果存在,则将其销毁
$('#btnUpload').uploadify('destroy');
}
} else {
//注意jquery下检查一个元素是否存在必须使用 .length >0 来判断
if ($('#btnUploadXLS').length > 0) {
//如果存在,则将其销毁
$('#btnUploadXLS').uploadify('destroy');
} }
}
});
}
</script>
</head>
<body>
<div class="result-wrap"> <form id="form1" runat="server">
<div>
<table style="width: 100%;">
<tr>
<td>
<asp:Button ID="btnAdd" runat="server" Text="添加" CssClass="btn btn6" OnClick="btnAdd_Click" /> <asp:Button CssClass="btn btn6" ID="btnDeleteMore" runat="server" Text="批量删除" OnClientClick="SelectUsers();" OnClick="btnDeleteMore_Click" /> <input class="btn btn6" type="button" name="name" id="btnMoreImport" value="批量导入" /> <asp:Button CssClass="btn btn6" ID="btnTemlpalteLoad" runat="server" Text="批导模版下载" OnClick="btnTemlpalteLoad_Click" /> <%--<a href="SignTest.aspx">签名信息列表</a>--%><asp:Button Text="批量启用" runat="server" ID="btnStartMore" CommandName="Start" CssClass="btn btn6" OnClientClick="SelectUsers();" OnClick="btnStartMore_Click" /> <asp:Button Text="批量停用" runat="server" OnClick="btnStartMore_Click" CssClass="btn btn6" OnClientClick="SelectUsers();" CommandName="Stop" ID="btnStopMore" /></td>
<td align="right">
<asp:TextBox runat="server" Text="请输入查询关键字" ID="txtSearch" CssClass="search" /> <asp:Button Text="查询" runat="server" CssClass="btn btn6" ID="btnSearch" OnClick="btnSearch_Click" /></td>
</tr>
</table>
<asp:HiddenField runat="server" ID="hdFieldIds" Value="" />
<br /> <div class="result-content">
<asp:Repeater ID="RptUserList" runat="server" OnItemDataBound="RptUserList_ItemDataBound">
<HeaderTemplate>
<table class="result-tab" style="width: 100%; text-align: center;" id="tbUsers">
<tr>
<th width="5%">
<a href="javascript:void(0)" id="lnkSelectAll">全选</a> </th>
<th width="5%">序号</th>
<th>用户名</th>
<th>签名人姓名</th>
<th>签名人样本</th>
<th>状态</th>
<th>操作</th>
</tr>
</HeaderTemplate>
<ItemTemplate>
<tr>
<td>
<input type="checkbox" name="name" value='<%#Eval("Sign_Code") %>' />
</td>
<td>
<asp:Literal ID="ltlItemNo" runat="server" />
</td>
<td><%#Eval("Sign_Code") %></td>
<td><%#Eval("Sign_Name") %></td>
<td id="td<%#Eval("Sign_Code") %>">
<asp:Literal Text="" ID="ltlSignSample" runat="server" />
</td>
<td>
<asp:LinkButton OnClick="lnkState_Click" ID="lnkState" Text="" runat="server" /></td>
<td>
<asp:LinkButton CommandArgument='<%#Eval("Sign_Code") %>' CommandName="Edit" Text="编辑" ID="lnkBtn" OnClick="lnkBtn_Click" runat="server" />
<asp:LinkButton Text="删除" CommandArgument='<%#Eval("Sign_Code") %>' CommandName="Delete" OnClick="lnkBtn_Click" runat="server" />
</td> </tr>
</ItemTemplate>
<FooterTemplate>
</table>
</FooterTemplate>
</asp:Repeater>
</div>
<div id="dialogxls" title="上传Excel文件" style="text-align: center; display: none;">
<input type="button" name="name" id="btnUploadXLS" value="上传" />
<span id="spanMsg">(只能上传.xlsx格式文件)</span>
</div>
<div id="dialog" title="上传签名样本" style="text-align: center; display: none;">
<input type="button" name="name" id="btnUpload" value="上传样本" />
<span>(只能上传.sign格式文件)</span>
</div> </div> <div class="list-page">
<%-- 分页样式一 首页 上一页 下一页 尾页--%>
<webdiyer:AspNetPager ID="AspNetPager1" runat="server"
CustomInfoHTML="共%PageCount%页,当前为第%CurrentPageIndex%页,每页%PageSize%条,共%RecordCount%条"
FirstPageText="首页"
LastPageText="尾页"
NextPageText="下一页"
PageIndexBoxType="TextBox"
PrevPageText="上一页"
ShowCustomInfoSection="Left"
ShowPageIndex="true"
ShowPageIndexBox="Always"
SubmitButtonText="Go"
SubmitButtonClass="right_d_btn"
TextAfterPageIndexBox="页"
TextBeforePageIndexBox="转到"
OnPageChanging="AspNetPager1_PageChanging"
AlwaysShow="True"
PageSize="10"
ShowMoreButtons="false"
HorizontalAlign="Center">
</webdiyer:AspNetPager> </div>
</form>
</div>
</body>
</html>
<script type="text/javascript"> //全选,全不选
$("#lnkSelectAll").click(function () {
var txt = $(this).text();
var flag = false;
var strIds = "";
if (txt == "全选") {
$(this).text("全不选");
flag = true;
} else {
$(this).text("全选");
flag = false;
}
$("#tbUsers td :checkbox").each(function () {
this.checked = flag;
});
if (flag) {
$("#tbUsers td :checkbox").each(function (index) {
strIds += $(this).val() + ",";
});
} else {
strIds = "";
}
$("#hdFieldIds").val(strIds) });
//选中的用户
function SelectUsers() {
var strIds = "";
$("#tbUsers td :checked").each(function (index) {
strIds += $(this).val() + ",";
});
$("#hdFieldIds").val(strIds) }
//批量导入
$("#btnMoreImport").click(function () {
$("#dialogxls").dialog("open");
//上传
//上传插件初始化方法
$('#btnUploadXLS').uploadify({ //选择文件后是否自动上传,默认为true
'auto': true,
//选择文件按钮
'buttonClass': 'some-class',
//是否开启调试模式
// 'debug': true,
//设置按钮文本
'buttonText': '上传人员信息文件',
//以get方式提交,默认post
'method': 'post',
//单个文件大小,0为无限制,可接受KB,MB,GB等单位的字符串值 上传大文件
'fileSizeLimit': '0',
'queueSizeLimit': 1,
//文件描述
'fileTypeDesc': 'Files',
'multi': false,
//允许上传的文件类型 以分号分割
'fileTypeExts': '*.xlsx',
//当浏览文件对话框关闭触发
'onDialogClose': function (queueData) {
if (queueData.filesSelected>0) {
$("#spanMsg").html("正在处理上传的文件,请稍等....");
}
},
//FLash文件路径
'swf': '/Scripts/uploadify/js/uploadify3.2.1/uploadify.swf',
//上传文件处理后台页面
'uploader': '/Ashx/SampleUp.ashx?action=xlsUpload',
//上传成功后触发,每个文件都触发
'onUploadSuccess': function (file, data, response) {
if (data == "0") {
alert("人员信息有不合法数据,请检查后再次上传");
return false;
} else {
window.location = window.location;
}
}
});
});
var strSignCode = "";
function Upload(strCode) {
strSignCode = strCode;
//打开弹出框的按钮
//单击按钮 调用弹出框的open方法
$("#dialog").dialog("open");
//上传
//上传插件初始化方法
$('#btnUpload').uploadify({ //选择文件后是否自动上传,默认为true
'auto': true,
//选择文件按钮
'buttonClass': 'some-class', //设置按钮文本
'buttonText': '上传样本',
'method': 'post',
//单个文件大小,0为无限制,可接受KB,MB,GB等单位的字符串值 上传大文件 可参考使用手册说明
'fileSizeLimit': '0',
'queueSizeLimit': 1,
//文件描述
'fileTypeDesc': 'Files',
'multi': false,
//允许上传的文件类型 以分号分割
'fileTypeExts': '*.sign',
'onUploadStart': function (file) {
$("#btnUpload").uploadify("settings", "formData", { 'code': strSignCode });
},
//FLash文件路径
'swf': '/Scripts/uploadify/js/uploadify3.2.1/uploadify.swf',
//上传文件处理后台页面
'uploader': '/Ashx/SampleUp.ashx?action=mainUpload',
//上传成功后触发,每个文件都触发
'onUploadSuccess': function (file, data, response) {
// window.location = window.location;
//上传成功,改变单元格内容,并停留在当前页面,可以避免刷新回到首页的情况。
$("#td" + strSignCode).html("<span>" + data + "</span>");
$("#dialog").dialog("close");
}
});
} //查询相关方法
//获得焦点时,将文本框清空,并移除样式。
//失去焦点时,判断是否为空,为空则将提示信息重新填回,并添加样式。
$("#txtSearch").focus(function () {
if ($(this).val() == "请输入查询关键字") {
$(this).val("");
$(this).removeClass("search");
}
}).blur(function () {
if ($(this).val() == "") {
$(this).val("请输入查询关键字");
$(this).addClass("search");
}
}); </script>
Main.aspx
添加人员信息页面:
业务逻辑:签名样本应跟签名人编号相同。只有输入了编号,才允许上传,并且保证上传后的签名样本名称为只读的。
关于只读框和密码框应注意的地方:[Asp.net]说说密码框和只读框
输入用户名后:
用户编辑页面:
由于添加和编辑页面代码较简单,就不再贴代码,需注意的就是只读框的取值。
辅助类
public class ExcelHelper
{
/// <summary>
/// 将Excel文件中的数据读出到DataTable中
/// </summary>
/// <param name="strFile">文件路径</param>
/// <returns>datatable</returns>
public static DataTable Excel2DataTable(string strFile, string strSheetName, string strTableName)
{
DataTable dt = new DataTable();
IWorkbook workbook = null;
using (FileStream fs = new FileStream(strFile, FileMode.Open, FileAccess.Read))
{
//office2003 HSSFWorkbook
//office2007 XSSFWorkbook初始化
workbook = new XSSFWorkbook(fs);
}
ISheet sheet = workbook.GetSheet(strSheetName);
//
dt = Export2DataTable(sheet, , false);
return dt; }
/// <summary>
/// 将指定sheet中的数据导入到datatable中
/// </summary>
/// <param name="sheet">指定需要导出的sheet</param>
/// <param name="HeaderRowIndex">列头所在的行号,-1没有列头</param>
/// <param name="needHeader">是否需要列头</param>
/// <returns>DataTable</returns>
private static DataTable Export2DataTable(ISheet sheet, int HeaderRowIndex, bool needHeader)
{
DataTable dt = new DataTable();
XSSFRow headerRow = null;
int cellCount;
try
{
if (HeaderRowIndex < || !needHeader)
{
headerRow = sheet.GetRow() as XSSFRow;
cellCount = headerRow.LastCellNum;
for (int i = headerRow.FirstCellNum; i <= cellCount; i++)
{
DataColumn column = new DataColumn(Convert.ToString(i));
dt.Columns.Add(column);
}
}
else
{
headerRow = sheet.GetRow(HeaderRowIndex) as XSSFRow;
cellCount = headerRow.LastCellNum;
for (int i = headerRow.FirstCellNum; i <= cellCount; i++)
{
ICell cell = headerRow.GetCell(i);
if (cell == null)
{
break;//到最后 跳出循环
}
else
{
//创建列
DataColumn column = new DataColumn(headerRow.GetCell(i).ToString());
//将列添加到datatable中
dt.Columns.Add(column);
} }
}
//保存最后一行的索引
int intRowCount = sheet.LastRowNum;
for (int i = HeaderRowIndex + ; i <= sheet.LastRowNum; i++)
{
XSSFRow xSSFRow = null;
if (sheet.GetRow(i) == null)
{
xSSFRow = sheet.CreateRow(i) as XSSFRow;
}
else
{
xSSFRow = sheet.GetRow(i) as XSSFRow;
}
DataRow dtRow = dt.NewRow();
for (int j = xSSFRow.FirstCellNum; j <= cellCount; j++)
{
//j=-1表示没有数据了
if (j != - && xSSFRow.GetCell(j) != null)
{
switch (xSSFRow.GetCell(j).CellType)
{
case CellType.Boolean:
dtRow[j] = Convert.ToString(xSSFRow.GetCell(j).BooleanCellValue);
break;
case CellType.Error:
dtRow[j] = ErrorEval.GetText(xSSFRow.GetCell(j).ErrorCellValue);
break;
case CellType.Formula:
switch (xSSFRow.GetCell(j).CachedFormulaResultType)
{ case CellType.Boolean:
dtRow[j] = Convert.ToString(xSSFRow.GetCell(j).BooleanCellValue); break;
case CellType.Error:
dtRow[j] = ErrorEval.GetText(xSSFRow.GetCell(j).ErrorCellValue); break;
case CellType.Numeric:
dtRow[j] = Convert.ToString(xSSFRow.GetCell(j).NumericCellValue); break;
case CellType.String:
string strFORMULA = xSSFRow.GetCell(j).StringCellValue;
if (strFORMULA != null && strFORMULA.Length > )
{
dtRow[j] = strFORMULA.ToString();
}
else
{
dtRow[j] = null;
}
break;
default:
dtRow[j] = "";
break;
}
break;
case CellType.Numeric:
if (DateUtil.IsCellDateFormatted(xSSFRow.GetCell(j)))
{
dtRow[j] = DateTime.FromOADate(xSSFRow.GetCell(j).NumericCellValue);
}
else
{
dtRow[j] = Convert.ToDouble(xSSFRow.GetCell(j).NumericCellValue);
}
break;
case CellType.String:
string str = xSSFRow.GetCell(j).StringCellValue;
if (!string.IsNullOrEmpty(str))
{ dtRow[j] = Convert.ToString(str);
}
else
{
dtRow[j] = null;
}
break;
default:
dtRow[j] = "";
break;
}
}
else
{
break;
}
}
//将行加入datatable中
dt.Rows.Add(dtRow);
}
}
catch (Exception ex)
{
throw ex;
}
return dt;
}
/// <summary>
/// 将DataTable中的数据导入Excel文件中
/// </summary>
/// <param name="dt"></param>
/// <param name="strFile"></param>
public static void DataTable2Excel(DataTable dt, string strFile, string strSheetName)
{
IWorkbook workbook = new XSSFWorkbook();
ISheet sheet = workbook.CreateSheet(strSheetName);
IRow header = sheet.CreateRow();
for (int i = ; i < dt.Columns.Count; i++)
{
ICell cell = header.CreateCell(i);
cell.SetCellValue(dt.Columns[i].ColumnName);
}
//数据
for (int i = ; i < dt.Rows.Count; i++)
{
IRow row = sheet.CreateRow(i + );
for (int j = ; j < dt.Columns.Count; j++)
{
ICell cell = row.CreateCell(j);
cell.SetCellValue(dt.Rows[i][j].ToString());
}
}
MemoryStream stream = new MemoryStream();
workbook.Write(stream);
byte[] buffer = stream.ToArray();
using (FileStream fs = new FileStream(strFile, FileMode.Create, FileAccess.Write))
{
fs.Write(buffer, , buffer.Length);
fs.Flush();
}
}
/// <summary>
/// 获取单元格类型
/// </summary>
/// <param name="xSSFCell">单元格</param>
/// <returns>object</returns>
private static object GetValueType(XSSFCell xSSFCell)
{
if (xSSFCell == null)
{
return null;
}
switch (xSSFCell.CellType)
{
case CellType.Blank:
return null;
case CellType.Boolean:
return xSSFCell.BooleanCellValue;
case CellType.Error:
return xSSFCell.ErrorCellValue; case CellType.Numeric:
return xSSFCell.NumericCellValue;
case CellType.String:
return xSSFCell.StringCellValue;
case CellType.Formula:
default:
return "=" + xSSFCell.StringCellValue;
}
} }
ExcelHelper
public class FTPHelper
{
#region 字段
/// <summary>
/// ftp地址,带ftp协议
/// </summary>
private string strFtpURI;
/// <summary>
/// ftp用户名
/// </summary>
private string strFtpUserID;
/// <summary>
/// ftp的ip地址
/// </summary>
private string strFtpServerIP;
/// <summary>
/// ftp用户登录密码
/// </summary>
private string strFtpPassword;
/// <summary>
/// ftp目录路径
/// </summary>
private string strFtpRemotePath;
#endregion /// <summary>
/// 连接FTP服务器
/// </summary>
/// <param name="strFtpServerIP">FTP连接地址</param>
/// <param name="strFtpRemotePath">指定FTP连接成功后的当前目录, 如果不指定即默认为根目录</param>
/// <param name="strFtpUserID">用户名</param>
/// <param name="strFtpPassword">密码</param>
public FTPHelper(string strFtpServerIP, string strFtpRemotePath, string strFtpUserID, string strFtpPassword)
{
this.strFtpServerIP = strFtpServerIP;
this.strFtpRemotePath = strFtpRemotePath;
this.strFtpUserID = strFtpUserID;
this.strFtpPassword = strFtpPassword;
this.strFtpURI = "ftp://" + strFtpServerIP + strFtpRemotePath;
} /// <summary>
/// 上载
/// </summary>
/// <param name="strFilename">本地文件路径</param>
/// <param name="strSavePath">ftp服务器文件保存路径</param>
public void Upload(string strFilename, string strSavePath)
{
FileInfo fileInf = new FileInfo(strFilename);
FtpWebRequest reqFTP;
reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(strFtpURI + strSavePath + fileInf.Name));
reqFTP.Credentials = new NetworkCredential(strFtpUserID, strFtpPassword);
reqFTP.Method = WebRequestMethods.Ftp.UploadFile;
reqFTP.KeepAlive = false;
reqFTP.UseBinary = true;
reqFTP.Proxy = null;
reqFTP.ContentLength = fileInf.Length;
int buffLength = ;
byte[] buff = new byte[buffLength];
int contentLen;
FileStream fs = fileInf.OpenRead();
try
{
Stream strm = reqFTP.GetRequestStream();
contentLen = fs.Read(buff, , buffLength);
while (contentLen != )
{
strm.Write(buff, , contentLen);
contentLen = fs.Read(buff, , buffLength);
}
strm.Close();
fs.Close();
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
}
/// <summary>
/// 上载
/// </summary>
/// <param name="strFilename">本地文件路径</param>
/// <param name="strSavePath">ftp服务器文件保存路径</param>
/// <param name="strStrOldName">ftp服务器文件保存的名字</param>
public void Upload(string strFilename, string strSavePath, string strStrOldName)
{
FileInfo fileInf = new FileInfo(strFilename);
FtpWebRequest reqFTP;
reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(strFtpURI + strSavePath + strStrOldName));
reqFTP.Credentials = new NetworkCredential(strFtpUserID, strFtpPassword);
reqFTP.Method = WebRequestMethods.Ftp.UploadFile;
reqFTP.KeepAlive = false;
reqFTP.UseBinary = true;
reqFTP.Proxy = null;
reqFTP.ContentLength = fileInf.Length;
int buffLength = ;
byte[] buff = new byte[buffLength];
int contentLen;
FileStream fs = fileInf.OpenRead();
try
{
Stream strm = reqFTP.GetRequestStream();
contentLen = fs.Read(buff, , buffLength);
while (contentLen != )
{
strm.Write(buff, , contentLen);
contentLen = fs.Read(buff, , buffLength);
}
strm.Close();
fs.Close();
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
}
/// <summary>
/// 下载
/// </summary>
/// <param name="strFilePath">本地保存路径</param>
/// <param name="strFileName">文件名</param>
/// <param name="strFileName">本地临时名称</param>
public void Download(string strFilePath, string strFileName, string strLocalName)
{
try
{
FileStream outputStream = new FileStream(strFilePath + strLocalName, FileMode.Create);
FtpWebRequest reqFTP;
reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(strFtpURI + strFileName));
reqFTP.Credentials = new NetworkCredential(strFtpUserID, strFtpPassword);
reqFTP.Method = WebRequestMethods.Ftp.DownloadFile;
reqFTP.UseBinary = true;
reqFTP.UsePassive = true;
reqFTP.Proxy = null;
FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();
Stream ftpStream = response.GetResponseStream();
long cl = response.ContentLength;
int bufferSize = ;
int readCount;
byte[] buffer = new byte[bufferSize];
readCount = ftpStream.Read(buffer, , bufferSize);
while (readCount > )
{
outputStream.Write(buffer, , readCount);
readCount = ftpStream.Read(buffer, , bufferSize);
}
ftpStream.Close();
outputStream.Close();
response.Close();
}
catch (Exception ex)
{
//记录日志
Common.LogHelper.WriteLog("文件下载异常:" + ex.Message);
}
}
/// <summary>
/// 下载
/// </summary>
/// <param name="strFilePath">本地保存路径</param>
/// <param name="strFileName">文件名</param>
public void Download(string strFilePath, string strFileName)
{
try
{
FileStream outputStream = new FileStream(strFilePath + strFileName, FileMode.Create);
FtpWebRequest reqFTP;
reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(strFtpURI + strFileName));
reqFTP.Credentials = new NetworkCredential(strFtpUserID, strFtpPassword);
reqFTP.Method = WebRequestMethods.Ftp.DownloadFile;
reqFTP.UseBinary = true;
reqFTP.UsePassive = true;
reqFTP.Proxy = null;
FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();
Stream ftpStream = response.GetResponseStream();
long cl = response.ContentLength;
int bufferSize = ;
int readCount;
byte[] buffer = new byte[bufferSize];
readCount = ftpStream.Read(buffer, , bufferSize);
while (readCount > )
{
outputStream.Write(buffer, , readCount);
readCount = ftpStream.Read(buffer, , bufferSize);
}
ftpStream.Close();
outputStream.Close();
response.Close();
}
catch (Exception ex)
{
//记录日志
Common.LogHelper.WriteLog("文件下载异常:" + ex.Message);
}
}
/// <summary>
/// 删除文件
/// </summary>
/// <param name="strFileName">文件名</param>
public void Delete(string strFileName)
{
try
{
FtpWebRequest reqFTP;
reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(strFtpURI + strFileName));
reqFTP.Credentials = new NetworkCredential(strFtpUserID, strFtpPassword);
reqFTP.Method = WebRequestMethods.Ftp.DeleteFile;
reqFTP.KeepAlive = false;
string result = String.Empty;
FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();
long size = response.ContentLength;
Stream datastream = response.GetResponseStream();
StreamReader sr = new StreamReader(datastream);
result = sr.ReadToEnd();
sr.Close();
datastream.Close();
response.Close();
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
} /// <summary>
/// 获取当前目录下明细(包含文件和文件夹)
/// </summary>
/// <returns></returns>
public string[] GetFilesDetailList()
{
try
{
StringBuilder result = new StringBuilder();
FtpWebRequest ftp;
ftp = (FtpWebRequest)FtpWebRequest.Create(new Uri(strFtpURI));
ftp.Credentials = new NetworkCredential(strFtpUserID, strFtpPassword);
ftp.Method = WebRequestMethods.Ftp.ListDirectoryDetails;
WebResponse response = ftp.GetResponse();
StreamReader reader = new StreamReader(response.GetResponseStream());
string line = reader.ReadLine();
line = reader.ReadLine();
line = reader.ReadLine();
while (line != null)
{
result.Append(line);
result.Append("\n");
line = reader.ReadLine();
}
result.Remove(result.ToString().LastIndexOf("\n"), );
reader.Close();
response.Close();
return result.ToString().Split('\n');
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
} /// <summary>
/// 获取FTP文件列表(包括文件夹)
/// </summary>
/// <param name="strUrl"></param>
/// <returns></returns>
private string[] GetAllList(string strUrl)
{
List<string> list = new List<string>();
FtpWebRequest req = (FtpWebRequest)WebRequest.Create(new Uri(strUrl));
req.Credentials = new NetworkCredential(strFtpPassword, strFtpPassword);
req.Method = WebRequestMethods.Ftp.ListDirectory;
req.UseBinary = true;
req.UsePassive = true;
try
{
using (FtpWebResponse res = (FtpWebResponse)req.GetResponse())
{
using (StreamReader sr = new StreamReader(res.GetResponseStream()))
{
string s;
while ((s = sr.ReadLine()) != null)
{
list.Add(s);
}
}
}
}
catch (Exception ex)
{
throw (ex);
}
return list.ToArray();
} /// <summary>
/// 获取当前目录下文件列表(不包括文件夹)
/// </summary>
public string[] GetFileList(string strUrl)
{
StringBuilder result = new StringBuilder();
FtpWebRequest reqFTP;
try
{
reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(strUrl));
reqFTP.UseBinary = true;
reqFTP.Credentials = new NetworkCredential(strFtpPassword, strFtpPassword);
reqFTP.Method = WebRequestMethods.Ftp.ListDirectoryDetails;
WebResponse response = reqFTP.GetResponse();
StreamReader reader = new StreamReader(response.GetResponseStream());
string line = reader.ReadLine();
while (line != null)
{ if (line.IndexOf("<DIR>") == -)
{
result.Append(Regex.Match(line, @"[\S]+ [\S]+", RegexOptions.IgnoreCase).Value.Split(' ')[]);
result.Append("\n");
}
line = reader.ReadLine();
}
result.Remove(result.ToString().LastIndexOf('\n'), );
reader.Close();
response.Close();
}
catch (Exception ex)
{
throw (ex);
}
return result.ToString().Split('\n');
} /// <summary>
/// 判断当前目录下指定的文件是否存在
/// </summary>
/// <param name="strRemoteFileName">远程文件名</param>
public bool FileExist(string strRemoteFileName)
{
string[] fileList = GetFileList("*.*");
foreach (string str in fileList)
{
if (str.Trim() == strRemoteFileName.Trim())
{
return true;
}
}
return false;
} /// <summary>
/// 创建文件夹
/// </summary>
/// <param name="strDirName">目录名</param>
public void MakeDir(string strDirName)
{
FtpWebRequest reqFTP;
try
{
reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(strFtpURI + strDirName));
reqFTP.Method = WebRequestMethods.Ftp.MakeDirectory;
reqFTP.UseBinary = true;
reqFTP.Credentials = new NetworkCredential(strFtpUserID, strFtpPassword);
FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();
Stream ftpStream = response.GetResponseStream();
ftpStream.Close();
response.Close();
}
catch (Exception ex)
{ Common.LogHelper.WriteLog("ftp服务器创建目录异常:" + ex.Message); }
} /// <summary>
/// 获取指定文件大小
/// </summary>
public long GetFileSize(string strFilename)
{
FtpWebRequest reqFTP;
long fileSize = ;
try
{
reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(strFtpURI + strFilename));
reqFTP.Method = WebRequestMethods.Ftp.GetFileSize;
reqFTP.UseBinary = true;
reqFTP.Credentials = new NetworkCredential(strFtpUserID, strFtpPassword);
FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();
Stream ftpStream = response.GetResponseStream();
fileSize = response.ContentLength;
ftpStream.Close();
response.Close();
}
catch (Exception ex)
{ throw ex; }
return fileSize;
} /// <summary>
/// 更改文件名
/// </summary>
public void ReName(string strCurrentFilename, string strNewFilename)
{
FtpWebRequest reqFTP;
try
{
reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(strFtpURI + strCurrentFilename));
reqFTP.Method = WebRequestMethods.Ftp.Rename;
reqFTP.RenameTo = strNewFilename;
reqFTP.UseBinary = true;
reqFTP.Credentials = new NetworkCredential(strFtpUserID, strFtpPassword);
FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();
Stream ftpStream = response.GetResponseStream();
ftpStream.Close();
response.Close();
}
catch (Exception ex)
{ throw ex; }
} /// <summary>
/// 移动文件
/// </summary>
public void MovieFile(string strCurrentFilename, string strNewDirectory)
{
ReName(strCurrentFilename, strNewDirectory);
} /// <summary>
/// 切换当前目录
/// </summary>
/// <param name="bIsRoot">true:绝对路径 false:相对路径</param>
public void GotoDirectory(string strDirectoryName, bool bIsRoot)
{
if (bIsRoot)
{
strFtpRemotePath = strDirectoryName;
}
else
{
strFtpRemotePath += strDirectoryName + "/";
}
strFtpURI = "ftp://" + strFtpServerIP + "/" + strFtpRemotePath + "/";
}
}
FTPHelper
Windows服务轮询
代码很简单,这里说明一下需要注意的地方,由于要调用c++动态链接库,并不是所有的异常信息都能catch到,所以在遇到bug的时候,比如dwg文件错误,就会造成服务停止,为了不让用户手动进入服务器进行手动启用,弄了一个exe程序,监听该服务是否启用,如果停用了,隔一段时间进行再次启用。
总结
由于该项目,客户只有管理员一个人使用,所以对项目的要求并不高,便宜我了,通过该项目,学到很多东西,之前也就负责功能模块,很没意思,不过这种从前端,到后台到数据库,都是自己弄的还是很有成就感的。
下周要去给客户部署了,最近一直在测试,一直在优化代码,轮询这块本来就是很费性能的,所以能想到的优化都用上了。
项目很小,也没什么要求只要能实现就可以,所以就随意发挥了。就当练练手了。
[Asp.Net]最近一个项目的总结的更多相关文章
- 对一个前端使用AngularJS后端使用ASP.NET Web API项目的理解(4)
chsakell分享了一个前端使用AngularJS,后端使用ASP.NET Web API的项目. 源码: https://github.com/chsakell/spa-webapi-angula ...
- 对一个前端使用AngularJS后端使用ASP.NET Web API项目的理解(3)
chsakell分享了一个前端使用AngularJS,后端使用ASP.NET Web API的项目. 源码: https://github.com/chsakell/spa-webapi-angula ...
- 对一个前端使用AngularJS后端使用ASP.NET Web API项目的理解(2)
chsakell分享了一个前端使用AngularJS,后端使用ASP.NET Web API的项目. 源码: https://github.com/chsakell/spa-webapi-angula ...
- 对一个前端使用AngularJS后端使用ASP.NET Web API项目的理解(1)
chsakell分享了一个前端使用AngularJS,后端使用ASP.NET Web API的项目. 源码: https://github.com/chsakell/spa-webapi-angula ...
- 【asp.net core 系列】6 实战之 一个项目的完整结构
0. 前言 在<asp.net core 系列>之前的几篇文章中,我们简单了解了路由.控制器以及视图的关系以及静态资源的引入,让我们对于asp.net core mvc项目有了基本的认识. ...
- 使用Visual Studio 2015 开发ASP.NET MVC 5 项目部署到Mono/Jexus
最新的Mono 4.4已经支持运行asp.net mvc5项目,有的同学听了这句话就兴高采烈的拿起Visual Studio 2015创建了一个mvc 5的项目,然后部署到Mono上,浏览下发现一堆错 ...
- ASP.NET MVC搭建项目后台UI框架—1、后台主框架
目录 ASP.NET MVC搭建项目后台UI框架—1.后台主框架 ASP.NET MVC搭建项目后台UI框架—2.菜单特效 ASP.NET MVC搭建项目后台UI框架—3.面板折叠和展开 ASP.NE ...
- 在ASP.NET Web API项目中使用Hangfire实现后台任务处理
当前项目中有这样一个需求:由前端用户的一个操作,需要触发到不同设备的消息推送.由于推送这个具体功能,我们采用了第三方的服务.而这个服务调用有时候可能会有延时,为此,我们希望将消息推送与用户前端操作实现 ...
- [Asp.net 5] DependencyInjection项目代码分析4-微软的实现(5)(IEnumerable<>补充)
Asp.net 5的依赖注入注入系列可以参考链接: [Asp.net 5] DependencyInjection项目代码分析-目录 我们在之前讲微软的实现时,对于OpenIEnumerableSer ...
随机推荐
- 解决数据库 Table 'content_tags' is marked as crashed and should be repaired 表损坏问题
今天突然网站TAG页面打不开了,打开debug,发现提示 Table 'content_tags' is marked as crashed and should be repaired 这样的错误 ...
- IDA64 Fatal error before kernel init
http://www.tuicool.com/articles/7FZVZna 第一次看到这个错误还以为是修改文件导致的,但是觉得又不大像,因为在Win7底下是完全正常的.搜索了一下才发现是由于插件导 ...
- C#:让您知道您的方法是被何“人”调用
我们要在DisabledObsoleteMethod函数里限制具有“Obsolete”属性的方法调用,我们如何去做呢?在.Net中提供了一个"StackFrame"类用于表示当前线 ...
- springBoot-自定义监听器
package com.cx.springboot.mylistener; import org.springframework.boot.context.event.ApplicationReady ...
- Jolokia
Jolokia 是一个用来访问远程 JMX MBeans 的崭新方法,与 JSR-160 连接器不同的是,它使用基于 HTTP 的 JSON 格式作为通讯协议,提供 JMX 批量操作等.需要第三方ja ...
- GO -- 一个经验
加锁要在有用的的上下文再加锁, 不要加的范围多了, 否则被锁住.
- [翻译] DTCoreText 从HTML文档中创建富文本
DTCoreText 从HTML文档中创建富文本 https://github.com/Cocoanetics/DTCoreText 注意哦亲,DTRichTextEditor 这个组件是收费的,不贵 ...
- 《实战突击:PHP项目开发案例整合(第2版)(含DVD光盘1张)》
<实战突击:PHP项目开发案例整合(第2版)(含DVD光盘1张)> 基本信息 作者: 徐康明 辛洪郁 出版社:电子工业出版社 ISBN:9787121221378 上架时间:2014 ...
- 正向代理/反向代理理解、Nginx概述、安装及配置详解
一.Nginx概述 nginx是一款自由的.开源的.高性能的HTTP服务器和反向代理服务器:同时也是一个IMAP.POP3.SMTP代理服务器:nginx可以作为一个HTTP服务器进行网站的发布处理, ...
- Microsoft Office Word 2007 文档结构图突然变小的解决办法
前记: 一个word文档不知道修改了什么,突然发现文档结构图显示的文字变得非常的小了. 用ctrl+鼠标滚轮只能放大或是缩小行间距,对文字没有什么变化. 解决办法: 1.打开文档结构图 点击视图,勾选 ...