我一直在尝试将以字节数组形式存储在数据库中的文件转换为网站上的可下载文件。下载链接似乎会产生一行重复的乱码。
我的文档已作为此类存储在数据库中
public class User
{
public string ResumeName { get; set; }
public byte[] Resume { get; set; }
public string ResumeContentType { get; set; }
}
为了将信息作为文档检索回来,我使用这个函数
public IActionResult Download(byte[] filebytes, string type, string name)
{
return File(filebytes, type, name);
}
网页本身使用此操作链接来生成创建下载链接的按钮
@Html.ActionLink("Download File", "Download", new {
filebytes = @UserManager.GetUserAsync(User).Result.Resume,
type = @UserManager.GetUserAsync(User).Result.ResumeContentType,
name = @UserManager.GetUserAsync(User).Result.ResumeName
})
运行代码时,单击链接不会执行任何可见操作,这意味着我无法看到它是如何出错的。然而,在新选项卡中打开链接会产生这个已大大缩短的长链接
https://localhost:7095/Home/Download?filebytes=80&filebytes=75&......(this repeated several hundred times)...... filebytes=0&filebytes=0&filebytes=0&filebytes=0&type=application%2Fvnd.openxmlformatsofficedocument.wordprocessingml.document&name=__xid-43512761_1.docx
为什么会发生这种情况?有办法解决吗?
退后一步,因为你刚才在某个地方转错了方向。考虑一下它的作用:
它向客户端返回一个文件。但它从哪里获取该文件的数据呢? 来自客户。您所遇到的情况是:
此场景中的潜在问题包括数据编码问题、URL 长度限制以及它完全没有必要的事实。
报废吧。
对于图像等,在页面上嵌入数据来呈现图像并不罕见。但对于可下载的文件来说,这没有多大意义。相反,仅包含服务器可以用来从数据中获取文件的标识符。例如:
现在该链接仅包含该用户的 ID。(我猜测实际
.Id
字段仅用于演示目的。使用您用来识别User
记录的任何值。)然后该
Download
操作接受该值并获取数据:再次强调,这仅用于演示目的。事实上,如果用户始终是当前登录的用户并且始终是已知的,那么您甚至不需要它
userId
,只需使用当前用户即可。无论哪种方式,重点是您不需要(甚至不想)在服务器和客户端之间来回传递文件的全部内容。只需显示页面所需的数据,并包含指向仅返回文件的单独控制器操作的链接。