但我很想知道如何使用urlrewriting来使用GUID或其他一些神秘的命名技术生成文件名,并使其在有限的时间内可用.
如果有人给我一篇关于它的好文章,我会很感激.
解决方法
你谈到URI重写,但这真的只是一点点抛光.您当然可以进行一些重写,将/ myFiles / a948ec43e5b743548fd9a77c462b953e转换为/myFiles/download.aspx?id=a948ec43e5b743548fd9a77c462b953e,甚至(在检查查找表后)到myFiles / download.aspx?id = 3或myFiles / download.aspx?文件名= myNewDownload.pdf.这与任何其他URI重写任务相同,所以现在让我们忽略它并假设我们有一个请求进入/myFiles/download.aspx?id=a948ec43e5b743548fd9a77c462b953e,无论是否是由于重写.
好的.你有一个标识符,你需要将它与三个东西相匹配:一个流,一个内容类型和一个到期日.
您可以将所有这些存储在文件系统中,所有这些都存储在数据库中或数据库中的详细信息中,包括将流存储为文件系统中文件的路径.
a948ec43e5b743548fd9a77c462b953e.application_pdf和a5d360178ec14e97abd556ed4b7709cf.text_plain; charset = utf-8
请注意,我们没有使用普通的Windows文件扩展名,因此我们很好地处理了上传机器与您的服务器绑定不同的情况.
如果a948ec43e5b743548fd9a77c462b953e是需要的项目,我们首先查看创建日期,如果它太久以前(文件已过期),我们发送一个410 GONE标题,并显示一条错误消息,说明文件已过期(我们也可以删除此时文件清理用法 – 或者可能截断它以使其保留文件曾经存在的记录,但是存储为0字节.
否则,我们将Response.ContentType设置为“application / pdf”,然后将Response.TransmitFile设置为发送文件.
如果我们以不同于文件的方式存储流,我们希望以小块(4096很好地匹配系统其他部分中的其他缓冲区)发送它,并且在它是非常大的调用响应的情况下.定期刷新()以防止内存问题.
这是你完成的基本系统. Niceties将包括存储原始文件名并将其发送到内容处置标头中,并遵守Range请求,以便用户可以恢复失败的下载而不必从头开始.
所有这些都与用于确保只有正确的人拥有该文件的任何身份验证非常正交 – 您可以将其与任何类型的登录系统一起使用,或者您可以将其公开但有时间限制.