C# 将MS Word.doc存储在数据库中,然后再次取出

C# 将MS Word.doc存储在数据库中,然后再次取出,c#,linq-to-sql,ms-word,C#,Linq To Sql,Ms Word,要在SQL中存储单词doc,我有以下方法: byte[] bytes = new byte[uploader.UploadedFiles[0].InputStream.Length]; var storedFile = new email_attachment(); string strFullPath = uploader.UploadedFiles[0].FileName; string strFileName = Path.G

要在SQL中存储单词doc,我有以下方法:

        byte[] bytes = new byte[uploader.UploadedFiles[0].InputStream.Length];
        var storedFile = new email_attachment();
        string strFullPath = uploader.UploadedFiles[0].FileName;
        string strFileName = Path.GetFileName(strFullPath);

        storedFile.email_attachment_id = Guid.NewGuid();
        storedFile.emailer_id = new Guid(dropMailers.SelectedValue);
        storedFile.file_name = strFileName;
        storedFile.file_data = bytes;
        db.email_attachments.InsertOnSubmit(storedFile);
        db.SubmitChanges();
要将其取回,我使用以下方法:

 var storedFile = db.email_attachments.Where(a => a.email_attachment_id.ToString() == dropAttachments.SelectedValue).Single();

        string strPath = System.Web.Hosting.HostingEnvironment.MapPath("~/Storage/Email/Attachments");

        File.WriteAllBytes(Path.Combine(strPath, storedFile.file_name), storedFile.file_data.ToArray());
        System.IO.FileInfo file = new System.IO.FileInfo(Path.Combine(strPath, storedFile.file_name));

        if (file != null && file.Exists)
        {
            Response.Clear();
            Response.AddHeader("Content-Disposition", "attachment; filename=" + file.Name);
            Response.AddHeader("Content-Length", file.Length.ToString());
            Response.ContentType = "application/octet-stream";
            Response.WriteFile(file.FullName);
            Response.End();
        }
        else
        {

            //Response.Write("This file does not exist.");

        }

问题:我返回的文档是空白的,我还认为将其保存在文件系统中,然后将其写入响应流不是很有效。我想这一步可以跳过。任何帮助或信息都将不胜感激。

让我们从以下代码开始:

byte[] bytes = new byte[uploader.UploadedFiles[0].InputStream.Length];
var storedFile = new email_attachment();
string strFullPath = uploader.UploadedFiles[0].FileName;
string strFileName = Path.GetFileName(strFullPath);

storedFile.email_attachment_id = Guid.NewGuid();
storedFile.emailer_id = new Guid(dropMailers.SelectedValue);
storedFile.file_name = strFileName;
storedFile.file_data = bytes;
db.email_attachments.InsertOnSubmit(storedFile);
db.SubmitChanges();
我可以看到您正在创建一个空数组,但我看不到您在哪里填充它。您不应该从
InputStream
中读取数据,而不是仅仅查找其长度吗

(您可能希望从输入流复制到
内存流
,然后使用
ToArray
在末尾获取字节数组。复制流的示例代码很多,在.NET 4中,甚至有
WriteTo
方法,这使复制更容易。)

我甚至还没有看过后面的代码-首先,让我们确保您首先将一些数据输入数据库…

写入数据库:

                byte[] bytes = new byte[uploader.UploadedFiles[0].InputStream.Length];
                uploader.UploadedFiles[0].InputStream.Read(bytes, 0, bytes.Length);

                var storedFile = new document();
                string strFullPath = uploader.UploadedFiles[0].FileName;
                string strFileName = Path.GetFileName(strFullPath);

                storedFile.document_id = Guid.NewGuid();
                storedFile.content_type = uploader.UploadedFiles[0].ContentType;
                storedFile.original_name = strFileName;
                storedFile.file_data = bytes;
                storedFile.date_created = DateTime.Now;
                db.documents.InsertOnSubmit(storedFile);
                db.SubmitChanges();
要将文档取回,请执行以下操作:

var storedFile = db.documents.Where(a => a.document_id.ToString() == dropAttachments.SelectedValue).Single();

            Response.Clear();
            Response.ContentType = "application/x-unknown";
            Response.AppendHeader("Content-Disposition", "attachment; filename=\"" + storedFile.original_name + "\"");
            Response.BinaryWrite(storedFile.file_data.ToArray());
            Response.End();

在这里找到了我的答案:

这个问题更多地与LINQ和数据库有关,而不是与SQL有关。内容类型不应该是application/msword吗?尝试了application/msword,但它不起作用。如果我把文件存储在硬盘上的某个地方-应用程序/八位字节流可以作为word文档(文档内容完整)在打开时正常工作。我找不到任何资源或示例代码。@FiveTools:您对哪一位有问题?将现有流复制到MemoryStream?感谢您在代码的第一部分给了我一个提示。我搜索了一下,找到了一些工作代码。我能够找出我遗漏了哪些步骤。在下面发布了我的解决方案。在一次调用Read中读取流是非常危险的。您假设所有数据都将立即可用,但情况并非总是如此。你应该经常循环阅读,直到没有更多的数据。我如何使这种方法“不那么危险”-