Невозможно загрузить файл размером более 3 МБ с использованием Angular js и Asp. net MVC Контроллер API - PullRequest
0 голосов
/ 21 июня 2020

Я использую Angular js и контроллер API c# для загрузки файлов, у меня есть элемент управления загрузкой файлов,

cs html

<input id="file" name="file" type="file" 
      ng-file-model="files" ng-model="file" multiple />

Я могу загрузить файлы размером 1 МБ, 2 МБ, передав filebytestring из службы. js в контроллер API после внесения изменений в web.config,

web.config

<httpRuntime targetFramework="4.6.1" maxRequestLength="1048576" executionTimeout="3600"/>


<security>
    <requestFiltering>
        <requestLimits maxAllowedContentLength="1073741824" />
    </requestFiltering>
</security>

Но когда я пытаюсь загрузить файл размером более 3 МБ, он не работает.

Контроллер. js

//Directive
app.directive('ngFileModel', ['$parse', function ($parse) {
    return {
        restrict: 'A',
        link: function (scope, element, attrs) {
            var model = $parse(attrs.ngFileModel);
            var isMultiple = attrs.multiple;
            var modelSetter = model.assign;
            element.bind('change', function () {
                var values = [];
                angular.forEach(element[0].files, function (item) {
                    var reader = new FileReader();
                    reader.readAsArrayBuffer(item);
                    reader.onload = function () {
                        var arrayBuffer = reader.result
                        var bytes = new Uint8Array(arrayBuffer);
                        var fileByteString = JSON.stringify(bytes);
                        var value = {
                            // File Name 
                            name: item.name,
                            //File Size 
                            size: item.size,
                            //File URL to view 
                            url: URL.createObjectURL(item),
                            // File Input Value 
                            _file: item,
                            // File byte string
                            fileByteString: fileByteString
                        };

                        values.push(value);
                    }
                });
                scope.$apply(function () {
                    if (isMultiple) {
                        modelSetter(scope, values);
                    } else {
                        modelSetter(scope, values[0]);
                    }
                });
            });
        }
    };
}]);

сервис. js

FormService.uploadFile = function (FileModel) {

    var requestURL = "/api/FileModelAPI/UploadFile";
    var uploadFile = $http({
        url: requestURL,
        method: 'POST',
        data: FileModel,
        headers: { "accept": "application/json;odata=verbose" },

    });
    return (uploadFile.then(handleUploadFileSuccess, handleUploadFileError));
}

function handleUploadFileSuccess(response) {
    return response.data;
}

function handleUploadFileError(xhr) {
    console.log(xhr);
}

API-контроллер

    [HttpPost]
    public ERFileResponseModel UploadFile([FromBody] FileModel request)
    {
        ERFileResponseModel response = new ERFileResponseModel();
        try
        {
            FileManager fileMgr = new FileManager();
            response = fileMgr.AddFile(request);
        }
        catch (Exception ex)
        {
        }

        return response;

    }

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

1 Ответ

0 голосов
/ 22 июня 2020

Какой код ошибки на стороне клиента во время загрузки? Свойство maxRequestLength может влиять на ограничение загрузки большого файла. https://docs.microsoft.com/en-us/dotnet/api/system.web.configuration.httpruntimesection.maxrequestlength?view=netframework-4.8 Попробуйте установить большое значение.

<httpRuntime targetFramework="4.6.1" maxRequestLength="2147483647" />

    <system.webServer>
  <security>
    <requestFiltering>
      <requestLimits maxAllowedContentLength="2147483647" />
    </requestFiltering>
  </security>
  </system.webServer>

Кроме того, я предлагаю вам изменить сигнатуру вашей функции, ссылаясь на приведенные ниже рекомендации, чтобы загрузить файл. https://docs.microsoft.com/en-us/aspnet/web-api/overview/advanced/sending-html-form-data-part-2 Сигнатура этой функции не должна содержать параметр при выборке потока данных из формы Html.

   public Task<HttpResponseMessage> PostFormData()
{
    // Check if the request contains multipart/form-data.
    if (!Request.Content.IsMimeMultipartContent())
    {
        throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType);
    }

    string root = HttpContext.Current.Server.MapPath("~/App_Data");
    var provider = new MultipartFormDataStreamProvider(root);

    // Read the form data and return an async task.
    var task = Request.Content.ReadAsMultipartAsync(provider).
        ContinueWith<HttpResponseMessage>(t =>
        {
            if (t.IsFaulted || t.IsCanceled)
            {
                Request.CreateErrorResponse(HttpStatusCode.InternalServerError, t.Exception);
            }

            // This illustrates how to get the file names.
            foreach (MultipartFileData file in provider.FileData)
            {
                Trace.WriteLine(file.Headers.ContentDisposition.FileName);
                Trace.WriteLine("Server file path: " + file.LocalFileName);
            }
            return Request.CreateResponse(HttpStatusCode.OK);
        });

    return task;
}

Вот пример. https://www.c-sharpcorner.com/article/upload-large-files-in-web-api-with-a-simple-method/ Не стесняйтесь сообщить мне, чем я могу помочь.

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