Скачайте AsBytes в mongodb gridfs, создав пустой файл - PullRequest
0 голосов
/ 06 июля 2018

Я загружаю файл в webapi, который сохраняет файл (документы в формате pdf и word) в mongodb gridfs (v 2.6.1)

код webapi

 var file = Request.Files[0];
 var fileName = file.FileName;
 var fileType = file.ContentType;
 var document = blabl.UploadFile(fileName, fileType,ReadFully(file.InputStream));

преобразование входящего потока в байты

public static byte[] ReadFully(Stream input)
{
   using (MemoryStream ms = new MemoryStream())
   {
       input.CopyTo(ms);
       return ms.ToArray();
   }
}

Код GridFs

var bucket = new GridFSBucket(_database, new GridFSBucketOptions
{
    BucketName = bucketName,
    WriteConcern = WriteConcern.WMajority,
    ChunkSizeBytes = 1048576
});

var id = bucket.UploadFromBytes(fileName, source, options);
return id;

Код для загрузки

var bucket = new GridFSBucket(_database, new GridFSBucketOptions
{
    BucketName = bucketName
});

return bucket.DownloadAsBytes(id);

WebAPI

HttpResponseMessage result = Request.CreateResponse(HttpStatusCode.OK);
result.Content = new ByteArrayContent(data);
result.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment")
{
    FileName = "MyPdf.pdf"
};
result.Content.Headers.ContentType = new MediaTypeHeaderValue("application/pdf");
return result;

код пользовательского интерфейса

$.ajax({
    url:'path',
    type: 'GET',
    responseType: 'arraybuffer',
     success: function (data)
     {
      var link = document.createElement('a');
       if ('download' in link) 
        {

            try {
             var blob = new Blob([data], { type: contentType });
             var url = urlCreator.createObjectURL(blob);
              link.setAttribute('href', url);
              link.setAttribute("download", filename);
              var event = document.createEvent('MouseEvents');
              event.initMouseEvent('click', true, true, window, 1, 0, 0, 0, 0, false, false, false, false, 0, null);
              link.dispatchEvent(event);

             } catch (ex) 
             {
               console.log(ex);
             }
         }
     }

  });

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

1 Ответ

0 голосов
/ 23 июля 2018

я изменил код webapi, как показано ниже

HttpResponseMessage httpResponseMessage = new HttpResponseMessage();
httpResponseMessage.Content = new ByteArrayContent(data.ToArray());
httpResponseMessage.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
httpResponseMessage.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment");
httpResponseMessage.Content.Headers.ContentDisposition.FileName = fileName;
httpResponseMessage.StatusCode = HttpStatusCode.OK;
return httpResponseMessage;

Кроме того, я забыл, что у меня есть обработчик делегирования, который изменяет ответ.

...