我们已经使用某些Web表单在Word Server(varbinary列)中成功添加了word文档,然后,我们希望某些员工能够下载它们。
我们有一些代码可以显示它,但是有时它会显示(在我的本地环境中),有时它却不显示,但是当它正式投入生产时。因此,我们只想下载它,无论它是否打开都没有关系(如果您没有安装Word),我们只想下载它,例如“另存为”。 。”功能。因为在我的本地环境中它运行良好,但是当它在IIS服务器上运行时,我们无法检索该文件(我想是因为它会自动打开WORD)。
这是检索它的代码。
public string showDoc(int id, int numRef)
{
string fileName = Path.GetTempFileName() + ".docx";
Db.Open();
string cuerito = "select doc from tbl_references where [userId]=@id and [refNum]=@numRef";
SqlCommand command = new SqlCommand(cuerito, base.Db);
command.Parameters.AddWithValue("@id", id);
command.Parameters.AddWithValue("@numRef", numRef);
using (SqlDataReader dr = command.ExecuteReader())
{
while (dr.Read())
{
int size = 1024 * 1024;
byte[] buffer = new byte[size];
int readBytes = 0;
int index = 0;
using (FileStream fs = new FileStream(fileName, FileMode.Create, FileAccess.Write, FileShare.None))
{
while ((readBytes = (int)dr.GetBytes(0, index, buffer, 0, size)) > 0)
{
fs.Write(buffer, 0, readBytes);
index += readBytes;
}
}
}
}
Db.Close();
return fileName;
}
在C#中是否有一种方法可以做到这一点?不显示而是仅从SQL Server下载?
EB。
答案 0 :(得分:0)
以上所有代码所做的是从二进制字段读取一些数据并将其写入流,然后将其写入服务器上的磁盘。提供文件供下载之前,无需将文件保存到磁盘,您只需将数据直接流式传输到客户端即可-如果您使用Google进行搜索,则有大量示例和先前的问题包含此过程的有效示例。它们将与任何文件一起使用,这些都不是特定于Word文件的。而且它们都不以任何方式与互操作有关。
顺便说一句,文件是直接下载到用户磁盘还是被打开(保存在用户计算机上的临时文件夹中)很大程度上取决于用户计算机的配置,用户使用的浏览器,是否安装了Word插件在该浏览器中,了解其常规下载设置。您可以设置HTTP标头(再次使用Google标头),该标头向浏览器提示只是保存文件而不是尝试打开文件,但最终它是由浏览器而不是服务器控制的。
这是一个从数据库表发送二进制数据作为文件下载的相当简单的示例:https://ygtechme.wordpress.com/2012/08/27/downloading-file-from-database-using-c-asp-net/。还有更多类似的主题,在线提供的主题略有不同。但这是一般的想法。
答案 1 :(得分:-1)
您发布的代码已经可以满足您的要求。