Как я могу загрузить файл и сохранить его к Потоку для дальнейшего предварительного просмотра с помощью C#?

В VS щелкните правой кнопкой по своему проекту, выберите, "Добавьте Ссылка...", и Вы будете видеть все пространства имен, которые существуют в Вашем GAC. Выберите Microsoft. SqlServer. Управление. RegisteredServers и нажимают "OK", и необходимо быть хорошими для движения

РЕДАКТИРОВАНИЕ:

, Который является способом, которым Вы хотите сделать это большую часть времени. Однако после небольшого количества ввода по абсолютному адресу вокруг я нашел этот выпуск о MS Connect. MS говорит, что это - известная проблема развертывания, и у них нет работы вокруг. Парень говорит, копирует ли он dll с папки GAC и отбрасывает его в его мусорном ведре, это работает.

12
задан Joachim Sauer 31 October 2009 в 10:56
поделиться

2 ответа

Конечно. Я загружаю файлы (PDF / изображения) в свою базу данных в моем приложении . Мой объект модели на самом деле хранит файл в виде массива байтов, но для других функций мне нужно преобразовывать в потоки и из потоков, поэтому я уверен, что его так же легко сохранить в формате потока.

Вот несколько примеров кода (скопируйте и вставьте) из моего приложения -

Объект File , который я использую для перемещения файлов (PDF / изображений) вокруг:

public class File : CustomValidation, IModelBusinessObject
{
    public int ID { get; set; }
    public string MimeType { get; set; }
    public byte[] Data { get; set; }
    public int Length { get; set; }
    public string MD5Hash { get; set; }
    public string UploadFileName { get; set; }
}

.. тип PdfDoc специально для файлов PDF:

public class PdfDoc : File
{
    public int ID { get; set; }
    public int FileID
    {
        get { return base.ID; }
        set { base.ID = value; }
    }
    [StringLength(200, ErrorMessage = "The Link Text must not be longer than 200 characters")]
    public string LinkText { get; set; }


    public PdfDoc() { }

    public PdfDoc(File file)
    {
        MimeType = file.MimeType;
        Data = file.Data;
        Length = file.Length;
        MD5Hash = file.MD5Hash;
        UploadFileName = file.UploadFileName;
    }

    public PdfDoc(File file, string linkText)
    {
        MimeType = file.MimeType;
        Data = file.Data;
        Length = file.Length;
        MD5Hash = file.MD5Hash;
        UploadFileName = file.UploadFileName;

        LinkText = linkText;
    }
}

.. пример действия, которое получает составной POST для загрузки файла:

    //
    // POST: /Announcements/UploadPdfToAnnouncement/ID
    [KsisAuthorize(Roles = "Admin, Announcements")]
    [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult UploadPdfToAnnouncement(int ID)
    {
        FileManagerController.FileUploadResultDTO files =
            FileManagerController.GetFilesFromRequest((HttpContextWrapper)HttpContext);
        if (String.IsNullOrEmpty(files.ErrorMessage) && files.TotalBytes > 0)
        {
            // add SINGLE file to the announcement
            try
            {
                this._svc.AddAnnouncementPdfDoc(
                    this._svc.GetAnnouncementByID(ID),
                    new PdfDoc(files.Files[0]),
                    new User() { UserName = User.Identity.Name });
            }
            catch (ServiceExceptions.KsisServiceException ex)
            {
                // only handle our exceptions
                base.AddErrorMessageLine(ex.Message);
            }
        }

        // redirect back to detail page
        return RedirectToAction("Detail", "Announcements", new { id = ID });
    }

Теперь вы можете видеть, что я передаю объект файла в мою службу здесь, но вы можете добавить его в сеанс и передать идентификатор обратно в например, "предварительный просмотр".

Наконец, вот общее действие, которое я использую для рендеринга файлов клиенту (у вас может быть что-то подобное для рендеринга файлов / потока из сеанса):

    //
    // GET: /FileManager/GetFile/ID
    [OutputCache(Order = 2, Duration = 600, VaryByParam = "ID")]
    public ActionResult GetFile(int ID)
    {
        FileService svc = ObjectFactory.GetInstance<FileService>();

        KsisOnline.Data.File result = svc.GetFileByID(ID);

        return File(result.Data, result.MimeType, result.UploadFileName);
    }

РЕДАКТИРОВАТЬ:
Я заметил, что мне нужно больше примеров, чтобы объяснить вышесказанное -

Для действия загрузки, описанного выше, класс FileUploadResultDTO :

    public class FileUploadResultDTO
    {
        public List<File> Files { get; set; }
        public Int32 TotalBytes { get; set; }
        public string ErrorMessage { get; set; }
    }

И функция GetFilesFromRequest :

    public static FileUploadResultDTO GetFilesFromRequest(HttpContextWrapper contextWrapper)
    {
        FileUploadResultDTO result = new FileUploadResultDTO();
        result.Files = new List<File>();

        foreach (string file in contextWrapper.Request.Files)
        {
            HttpPostedFileBase hpf = contextWrapper.Request.Files[file] as HttpPostedFileBase;
            if (hpf.ContentLength > 0)
            {
                File tempFile = new File()
                {
                    UploadFileName = Regex.Match(hpf.FileName, @"(/|\\)?(?<fileName>[^(/|\\)]+)$").Groups["fileName"].ToString(),   // to trim off whole path from browsers like IE
                    MimeType = hpf.ContentType,
                    Data = FileService.ReadFully(hpf.InputStream, 0),
                    Length = (int)hpf.InputStream.Length
                };
                result.Files.Add(tempFile);
                result.TotalBytes += tempFile.Length;
            }
        }

        return result;
    }

И наконец (надеюсь, у меня есть все, что вам нужно сейчас) это ReadFully функция. Это не мой дизайн. Получил из сети - чтение потока может быть сложной задачей. Я считаю, что эта функция является наиболее успешным способом полного чтения потока:

    /// <summary>
    /// Reads data from a stream until the end is reached. The
    /// data is returned as a byte array. An IOException is
    /// thrown if any of the underlying IO calls fail.
    /// </summary>
    /// <param name="stream">The stream to read data from</param>
    /// <param name="initialLength">The initial buffer length</param>
    public static byte[] ReadFully(System.IO.Stream stream, long initialLength)
    {
        // reset pointer just in case
        stream.Seek(0, System.IO.SeekOrigin.Begin);

        // If we've been passed an unhelpful initial length, just
        // use 32K.
        if (initialLength < 1)
        {
            initialLength = 32768;
        }

        byte[] buffer = new byte[initialLength];
        int read = 0;

        int chunk;
        while ((chunk = stream.Read(buffer, read, buffer.Length - read)) > 0)
        {
            read += chunk;

            // If we've reached the end of our buffer, check to see if there's
            // any more information
            if (read == buffer.Length)
            {
                int nextByte = stream.ReadByte();

                // End of stream? If so, we're done
                if (nextByte == -1)
                {
                    return buffer;
                }

                // Nope. Resize the buffer, put in the byte we've just
                // read, and continue
                byte[] newBuffer = new byte[buffer.Length * 2];
                Array.Copy(buffer, newBuffer, buffer.Length);
                newBuffer[read] = (byte)nextByte;
                buffer = newBuffer;
                read++;
            }
        }
        // Buffer is now too big. Shrink it.
        byte[] ret = new byte[read];
        Array.Copy(buffer, ret, read);
        return ret;
    }
15
ответ дан 2 December 2019 в 19:54
поделиться

Да, но вы не можете сохранить его в потоке. Поток не содержит никаких данных, это просто средство доступа к фактическому хранилищу.

Получить данные в виде байтового массива,

2
ответ дан 2 December 2019 в 19:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: