Сохраните MS Word .doc в базе данных, а затем вытащите его снова - PullRequest
0 голосов
/ 29 июля 2010

Для хранения слова doc в SQL у меня есть это:

        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.");

        }

Проблемы: Документ, который я получаю, пусти я также считаю, что сохранение его в файловой системе и последующая запись в поток ответов не очень эффективно.Я думаю, что этот шаг можно пропустить.Любая помощь или информация будет высоко ценится.

Ответы [ 2 ]

1 голос
/ 29 июля 2010

Давайте посмотрим на этот код, чтобы начать с:

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 вместо того, чтобы просто узнать его длину?

(Возможно, вы захотите скопировать из входного потока в MemoryStream, а затем использовать ToArray, чтобы получить байтовый массив в конце. Существует множество примеров кода для копирования потока - и. В NET 4 есть даже метод WriteTo, который облегчает его.)

Я даже не посмотрел на более поздний код - сначала давайте удостоверимся, что сначала вы действительно внесете некоторые данные в базу данных ...

0 голосов
/ 29 июля 2010

Для записи в БД:

                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();

Нашёл ответ здесь: http://imar.spaanjaars.com/414/storing-uploaded-files-in-a-database-or-in-the-file-system-with-aspnet-20#Downloads

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...