c # web api возвращает весь файл вместо байтового массива - PullRequest
0 голосов
/ 11 июня 2018

для моего текущего веб-API, я возвращаю файл как байт [], и он работает через следующий код.

[Route("GetReferenceFile")]
    [HttpPost]
    public HttpResponseMessage GetReferenceFile([FromBody]ReferenceFileMonitorRetrievingRequest request)
    {
        try
        {
            var fileName = request.fileName;
            //get file path
            var filePathWoFileName = _manager.GetReferenceFileForReferenceFileMonitor(request.fileName, request.fileFolderPathWithFileName);
            //convert file into bytes array
            var dataBytes = File.ReadAllBytes(filePathWoFileName + request.fileName);
            //add bytes to memory stream 
            var dataStream = new MemoryStream(dataBytes);
            //send out
            HttpResponseMessage httpResponseMessage = Request.CreateResponse(HttpStatusCode.OK);
            httpResponseMessage.Content = new StreamContent(dataStream);
            httpResponseMessage.Content.Headers.ContentDisposition = new System.Net.Http.Headers.ContentDispositionHeaderValue("attachment");
            httpResponseMessage.Content.Headers.ContentDisposition.FileName = fileName;
            httpResponseMessage.Content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/octet-stream");

            return httpResponseMessage;
        }
        catch (IOException e)
        {
            logger.Error("Error Message: " + e.Message + " Stack Trace: " + e.StackTrace);
            return Request.CreateResponse(HttpStatusCode.InternalServerError, e);
        }
        catch (Exception ex)
        {
            logger.Error("Error Message: " + ex.Message + " Stack Trace: " + ex.StackTrace);
            return Request.CreateResponse(HttpStatusCode.InternalServerError, ex);
        }

Могу ли я спросить, есть ли другой способ отправить файл целиком вместо чтения файла как байта [] и пересылки?потому что я боялся, что чтение как byte [] может немного изменить файл, например: пространство, занимаемое «Tab», может не остаться прежним.

Заранее спасибо.


Отредактировано:

Я использовал System.Text.Encoding.UTF8.GetString (// байтовый массив) для преобразования байтового массива в строку и записи в файл.вызовет ли это какую-либо озабоченность по поводу изменения исходного содержимого файла?Спасибо.

public async Task<string> GetReferenceFile(ReferenceFileRequest referenceFileRequest)
    {
        ConfigurationManager.RefreshSection("appSettings");
        var URL = ConfigurationManager.AppSettings["GetReferenceFile"];
        byte[] refFile = new byte[0];
        try
        {
            Client.DefaultRequestHeaders.Accept.Clear();
            Client.DefaultRequestHeaders.Accept.Add(
                new MediaTypeWithQualityHeaderValue("application/json"));
            HttpResponseMessage response = await Client.PostAsJsonAsync(URL, referenceFileRequest);

            refFile = await response.Content.ReadAsByteArrayAsync();
            return System.Text.Encoding.UTF8.GetString(refFile); //Convert to string
        }
        catch (Exception ex)
        {
            logData.LogError("Error Message: " + ex.Message + " Stack Trace: " + ex.StackTrace);
            return null;
        }
    }

1 Ответ

0 голосов
/ 11 июня 2018

Чтобы решить ваши проблемы: байты - это самый низкий уровень, на котором .NET может читать файл при использовании стандартного кода ввода-вывода.Когда вы читаете байты, вы читаете необработанные данные файла.Не имеет значения, является ли это EXE-файлом, документом Word или текстовым файлом.Проблемы, которые вы описываете, могут возникнуть, когда вы начнете пытаться конвертировать между байтами и текстом, используя неправильную кодировку .Поскольку вы не делаете ничего подобного здесь, у вас не должно быть проблем.

Однако вы можете сделать оптимизацию.В данный момент вы читаете весь файл в память.Вместо этого вы можете направить файл напрямую к ответу.

Заменить этот код:

var dataBytes = File.ReadAllBytes(filePathWoFileName + request.fileName);
//add bytes to memory stream 
var dataStream = new MemoryStream(dataBytes);
//send out
HttpResponseMessage httpResponseMessage = Request.CreateResponse(HttpStatusCode.OK);
httpResponseMessage.Content = new StreamContent(dataStream);

этим:

var dataStream = File.OpenRead(filePathWoFileName + request.fileName);
//send out
HttpResponseMessage httpResponseMessage = Request.CreateResponse(HttpStatusCode.OK);
httpResponseMessage.Content = new StreamContent(dataStream);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...