Com.urp.command.FileFrameWork(2)
昨天做到了UploadFileFrame,基本上上算是完成了上传的功能,今天继续做完下载的部分。Google上搜一下,关于asp.net下载的文章不在少数,所以也没有必要讨论怎么做了。在JSF中,下载是通过修改Response的header实现的,想想,ASP.net应该也能通过这种方法来做吧,果然找到了相关的文章。在博客园上就有,地址:http://www.cnblogs.com/Meyer/archive/2004/04/21/6977.aspx,而且人家是04年就写了,看看自己,原来还只是菜鸟一只:)
Java的代码:
HttpServletResponse response = (HttpServletResponse)getFacesContext().getExternalContext().getResponse();
response.reset();
response.setContentType("application/vnd.ms-excel");
response.setHeader("Content-Disposition", "attachment; filename=" + downloadFile.getFileAPIName() );
response.setContentLength(baos.size());
sos=response.getOutputStream();
baos.writeTo(sos);
sos.flush();
C#的代码:
_response.Clear();
_response.ContentType = _fileAPI.ContentType;
_response.AddHeader("Content-Disposition", "attachment; filename=" + _fileAPI.FileName);
_response.WriteFile(_fileAPI.Path);
_response.Flush();
_response.End();
发现,java和.Net真是惊人的相似。
注意点1
原来写的时候,这些代码是在controller层的,现在决定放进DownloadFileFram里,真正做到只需要调用一句execute就完成任务了:),但是要注意,需要传一个HttpContext.Current.Response进来。而且发现昨天的设计有点问题。在ExcelFile类的构造函数中传了一个fileType进去,其实完全没有必要,ExcelFile类肯定是对Excel文件操作的,文件类型自然也是定下来的了。
注意点2
上传文件的时IFileAPI是通过HttpPostedFile的ContentType来构造的,但下载文件的时候是通过FileInfo.Extension来构造的。所以又重新写了一个DownloadAPIFactory,用于在下载文件是构造IFileAPI,并且在IFileAPI增加了ContentType属性,在至于为什么不用简单工厂,是因为想到以后可能构造的时候需要去读xml的文件信息,通过xml来配置上传,下载的临时目录。为了让用户可以选择配置的方法,也许要用抽象Factory作为参数的,所以到时再写一个ConfingFactory也说不定,不知道考虑的是否正确。
注意点3
IFileAPI类中保存了FileType,ContentType这些和具体的文件类型有关的属性,LocalFile类中有一个和具体文件类型无关的Path属性。文件的简单的写入和读出都和文件类型无关,都在LocalFile中实现。所以还应该再有一个类实现IFileAPI,用来处理当文件类型不能识别时的上传下载。
外观层的类图现在修改如下: