С# WebAPI для загрузки файла PowerPoint с использованием потока памяти

Это мой код для загрузки файла PowerPoint. Я использовал пакет aspose для powerpoint, это ссылка на документацию aspose https://docs.aspose.com/dashboard.action

    [HttpGet]
    [Route("exportpowerpoint1")]
    public HttpResponseMessage Export()
    {           
        using (Presentation presentation = new Presentation(HttpContext.Current.Server.MapPath("~/PPTexports/testfile.pptx")))
        {
            MemoryStream stream = new MemoryStream();
            presentation.Save(stream, SaveFormat.Pptx);
            stream.Position = 0;
            var returnResult = Request.CreateResponse(HttpStatusCode.OK);
            returnResult.Content = new StreamContent(stream);
            returnResult.Content.Headers.ContentType = new MediaTypeHeaderValue("application/vnd.openxmlformats-officedocument.presentationml.presentation");
            returnResult.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment")
            {
                FileName = "testfile.pptx"
            };                
            return returnResult;
        }}

с этим кодом я могу загрузить файл, но когда я открываю файл, Powerpoint выдает это сообщение об ошибке, и размер файла также удваивается

Сообщение об ошибке: PowerPoint обнаружил нечитаемый контент в файле testfile.pptx

Я думаю, что поток памяти записывает файл два раза, поэтому размер увеличился вдвое, и файл не может быть открыт из-за дублирующегося содержимого, но я не могу найти причину проблемы. Кто-нибудь может помочь?


person Ginish Sharma    schedule 20.11.2019    source источник
comment
что такое Презентация? обратитесь к этому: stackoverflow.com/questions/23768596/   -  person farbiondriven    schedule 20.11.2019
comment
Я использовал пакет aspose для powerpoint, поэтому класс powerpoint находится в пакете aspose NuGet.   -  person Ginish Sharma    schedule 20.11.2019
comment
Это presentation.Save() в нужном месте? В этот момент вы ничего не читали в поток. Также вы не должны возвращать IHttpActionResult из FileHttpActionResult. Вы смотрели загруженный файл в блокноте, например? Я предполагаю, что в нем есть куча текста из html, если это был правильный pptx, вы должны были изменить расширение на .zip и открыть его с помощью winzip.   -  person cjb110    schedule 20.11.2019
comment
Я открыл загруженный файл с помощью Блокнота, и содержимое загруженного файла выглядит измененным, как исходное, поэтому я не знаю причину этого.   -  person Ginish Sharma    schedule 21.11.2019


Ответы (2)


Попробуй это:

[HttpGet]
[Route("exportpowerpoint1")]
public HttpResponseMessage Export()
{   
    var returnResult = Request.CreateResponse(HttpStatusCode.OK);
    returnResult.Content = new StreamContent(File.OpenRead(HttpContext.Current.Server.MapPath("~/PPTexports/testfile.pptx")));
    returnResult.Content.Headers.ContentType = new MediaTypeHeaderValue("application/vnd.openxmlformats-officedocument.presentationml.presentation");
    returnResult.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment")
    {
        FileName = "testfile.pptx"
    };                
    return returnResult;
}
person farbiondriven    schedule 20.11.2019
comment
это также дает то же сообщение об ошибке, когда я открываю загруженный файл в powerpoint - person Ginish Sharma; 20.11.2019

Не делайте того, что сделал я, и поместите MemoryStream в блок using... вы не получите ответа, так как он был удален до того, как содержимое было отправлено.

person ccook    schedule 11.05.2020