由于工作需要,最近在公司负责开发一个web系统,其中一个需求就是用户上传文件后,该文件的最后修改时间不能改变,经过一番探索之后,基本搞掂这个需求。现将试验用的代码(非完整代码)与大家分享,请高手指点,请asp.net菜鸟与我交流^_^
upload.aspx中的代码
<form id="form1" runat="server" method="post" enctype="multipart/form-data">
<input id="File1" type="file" runat="server"/><br/>
<asp:button ID="Button1" runat="server" text="Button" οnclick="Button1_Click1" />
<asp:Label ID="Label1" runat="server" Text="Label" ></asp:Label>
</form>
upload.aspx.cs中的代码
using System.IO;
protected void Button1_Click1(object sender, EventArgs e)
{
if ("" == File1.Value)
{
Label1.Text = "没指定文件";
}
else
{
string filepath = File1.Value;//获取要上传的文件在客户端的完整路径
FileInfo fileinfo = new FileInfo(filepath);//文件信息对象,可用来设置或获取文件的各种信息
Label1.Text = "";
Label1.Text = fileinfo.LastWriteTime.ToString() + "<br/>";
DateTime lastwritetime = fileinfo.LastWriteTime;//获得上传文件的最后修改时间
string filename = Path.GetFileName(File1.Value);//获得上传文件的文件名
string savePath = "E://WebSites//WebSite2//UploadFile//" + filename;//服务器端保存路径
File1.PostedFile.SaveAs(savePath);//保存文件到服务器
FileInfo uploadfileinfo = new FileInfo(savePath);//建立上传到服务器后的文件的FileInfo对象
uploadfileinfo.LastWriteTime = lastwritetime;//修改为原来的最后修改时间
Label1.Text += uploadfileinfo.LastWriteTime.ToString();
}
}
_____________________________________________________________________________________
很不好意思!上面的代码中犯了一个很低级的错误,贻笑大方了,没注意到一切都是在我的电脑上进行,模仿实际场景把文件放到Web服务器之后,到另一台机子上访问发现是错误的。我也不把上面的代码删掉,作为对自己的提醒。
在编码之前,请先把scrrun.dll(一般在scrrun.dll中)添加到bin文件夹中。
下面是经过实际测试可行的代码。
upload.aspx
<html>
<head>
<title>上传文件</title>
<script language="JavaScipt">
function submit()
{
var fso = new ActiveXObject("scripting.FileSystemObject");
var filePath = File1.value;
var f = fso.GetFile(filePath);
var lwt = Date.parse(f.DateLastModified);
document.getElementById("lwtTextBox").value=lwt;
}
</script>
</head>
<body>
<form method="post" enctype="application/multipart" runat="server">
<input type="file" runat="server" id="File1"/><br/>
<input type="button" οnclick="submit;javascript:document.Forms[0]['webBtn'].click();">
<br/>
<asp:button id="webBtn" runat="server" OnClick="webBtn_Click"/>
<input type="text" id="lwtTextBox" runat="server"/>
</form>
</body>
</html>
upload.aspx.cs
...............
protected void webBtn_Click(object sender, EventArgs e)
{
string lastwritetime = lwtTextBox.value;
把lastwritetime转换成DateTime对象,lastModifiTime
string FileSavePath = 服务端保存路径+Path.GetFileName(File1.value);
File1.PostedFile.SaveAs(FileSavePath);
FileInfo uploadFileInfo = new FileInfo(FileSavePath);
uploadFileInfo.LastWriteTime = lastModifiTime;
}
总结:
实现保留源文件最后访问时间这一功能的难点在于,要在文件还没保存到服务器端之前就获取到文件的最后修改时间,然后把这一时间传送给后台代码,也就是客户端函数与服务器端函数之间的通信这一问题。
对于第一点,使用FileSystemObject对象就能够搞掂,对于第二点我花了一天的功夫才发现原来可以如下实现:
<input type="button" οnclick="submit;javascript:document.Forms[0]['webBtn'].click();">
即在客户端函数执行完毕后立即调用后台函数。但这需要多一个按钮,通过它的OnClick事件来调用对应的后台处理函数。
...............
上文是我凭记忆写的,肯定有很多小错误,但大体思路就是这样。如果各位朋友有兴趣试一试,请自行修改。如果有更好的方法,请留言与我交流,在下不胜感激。