在portal starter kit中实现了简单的上传下载功能。这里总结一下。当然原代码中上传下载还是存在一定问题的,这里稍微做了一些修改。

上传功能分为两种模式:直接将文件上传到服务文件夹中;以二进制的形式保存到数据库中。

注意要上传文件,需要将设置窗体的Form的类型

<form enctype="multipart/form-data" runat="server">

(enctype:获取或设置将窗体的数据发送到服务器时浏览器使用的编码类型。)

1.二进制形式上传和下载文件

上传,代码如下:

1 // for web farm support 
2 int length = (int) FileUpload.PostedFile.InputStream.Length; 
3 String contentType = FileUpload.PostedFile.ContentType; 
4 byte[] content = new byte[length]; 
5 FileUpload.PostedFile.InputStream.Read(content, 0, length); 
6 string filename = Path.GetFileName(FileUpload.PostedFile.FileName); 
7 DataAccess.UpdateTable(content,contenttype,length,filename)

利用Asp.net中的上传文件控件

<input type="file" id="FileUpload" runat="server" NAME="FileUpload">

读取上传文件的长度(Length)和内容类型(ContentType),并将上传文件的内容读取到字节数组中,然后保存保存到数据库中即可。

下载:

比较简单的做法是新建一个aspx页面,然后在它的Page_Load()事件里取出二进制字节流,然后再读出来就可以了,portal starter kit就是采用的该方法。当然也可以不用这样的方法,

将下载链接指向某个页面

"~/DesktopModules/ViewDocument.aspx?DocumentID=" + documentId.ToString();

该文件没有任何内容,只是用来下载文件用的。(当然,不单独设计该页面也可以,可以使用HttpHandler)

在该页面的Page_Load事件中,代码如下:

//首先从数据库中获取保存文件的那条纪录 
SqlDataReader dBContent = documents.GetDocumentContent(documentId); 
Response.Buffer = true; 
Response.Clear(); 
Response.AppendHeader("content-disposition","attachment;filename=" + (String)dBContent["FileFriendlyName"]); 

// 输出文档类型 
Response.ContentType = (String) dBContent["ContentType"]; 
// 输出 
Response.OutputStream.Write((byte[]) dBContent["Content"], 0, (int) dBContent["ContentSize"]); 
Response.Flush(); 
// 结束 
Response.End();

2.直接将文件上传到服务器文件夹中

上传到文件夹(当然首先保证,该文件夹具有操作权限)

1 // 默认上传到/uploads文件夹下的虚拟路径 
2 String virtualPath = "~/uploads/" + Path.GetFileName(FileUpload.PostedFile.FileName); 
3 
4 // 要上传到服务器上的物理路径 
5 String phyiscalPath = Server.MapPath(virtualPath); 
6 
7 // 上传 
8 FileUpload.PostedFile.SaveAs(phyiscalPath);

主要是利用.Net的上传控件的SaveAS方法将文件直接上传到服务器端指定的文件夹下。

下载:对于此类的下载可以直接用链接指向该文件路径即可。

1 <asp:TemplateColumn> 
2 <ItemTemplate> 
3 <asp:HyperLink id="editLink" ImageUrl="~/images/edit.gif" NavigateUrl='<%# DataBinder.Eval(Container.DataItem,"FileUrl") %>'/> 
4 </ItemTemplate> 
5 </asp:TemplateColumn>

目前,这种方式的下载好像有些问题,当上传了.txt文件时,在点击下载链接时,没有出现保存页面的界面,而是直接在IE中打开了文件。但是,可以右键另存为下载。

其实对于直接保存到服务器文件夹中的文件下载也可以采用保存到数据库中文件的下载,只是

输出的二进制字节是打开相应的文件读取的,而不是直接从数据库中取出来的。

1 System.IO.FileStream fs = System.IO.File.OpenRead(Server.MapPath((String)dBContent["FileNameUrl"])); 
2 byte[] data = new byte[fs.Length]; 
3 fs.Read (data, 0, data.Length); 
4 Response.OutputStream.Write(data, 0, data.Length);