在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
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,用来处理当文件类型不能识别时的上传下载。 外观层的类图现在修改如下:
FileType包的类图修改如下:
|
请发表评论