c# - 使用 ng-file 的 AngularJS HTTP POST

标签 c# angularjs asp.net-web-api

我似乎无法使用 ng-file upload 进行此操作。 我需要在我的 Controller 中使用网桥 ID 传递罚款

我得到的错误是:

"{"Message":"No HTTP resource was found that matches the request URI 
'http://localhost/api/BridgeController/'.","MessageDetail":"No type was 
found that matches the controller named 'BridgeController'."}"

无法弄清楚为什么它找不到我的方法。有什么想法吗?

这是我的 Controller 代码,将被移动到服务中

$scope.uploadFile = function (file) {
    console.log("hitting file upload", $scope.selectedBridge);
    if (file) {
        debugger;

        var request = {
            method: 'POST',
            url: '/api/Bridge/UploadBridgeImage',
            data: angular.toJson($scope.selectedBridge.BridgeID),
            file: file,
            headers: { 'Content-Type': undefined }
        };

        Upload.upload(request).then(function (response) {

        });
    }
}

和后端 C#

[HttpPost]
[Route("api/Bridge/UploadBridgeImage")]
public IHttpActionResult UploadBridgeImage()
{
    try
    {
        var uploadedFiles = HttpContext.Current.Request.Files;

        for (int i = 0; i < uploadedFiles.Count; i++)
        {
            var fileToSave = uploadedFiles[i];

            var fileBytes = _iStremHelper.GetBytes(fileToSave.InputStream, fileToSave.ContentLength);
            var file = BridgeFileEntity(fileBytes, fileToSave, 1);

            using (_iFileRepository)
            {
                _iFileRepository.Save(file);
            }
        }
        return Ok();
    }
    catch (Exception ex)
    {
        return InternalServerError();
    }
}

在此处编辑代码。 我能够在我的 C# Controller 中的那个 post 方法中达到我的断点。文件有我需要的所有数据。现在我需要以某种方式获取“数据”。知道它在上下文中的位置吗?

最佳答案

为了在 web api Controller 中获取文件流(在内存中)和额外的 json 数据,您可以定义自定义 MultipartStreamProvider:

class MultipartFormDataInMemoryStreamProvider : MultipartFormDataRemoteStreamProvider
{
    public override RemoteStreamInfo GetRemoteStream(HttpContent parent, HttpContentHeaders headers)
    {
        return new RemoteStreamInfo(new MemoryStream(), string.Empty, string.Empty);
    }
}

然后在 Controller 中使用它:

public async Task<IHttpActionResult> UploadBridgeImage()
{
    var provider = await Request.Content.ReadAsMultipartAsync(new MultipartFormDataInMemoryStreamProvider());
    foreach (var httpContent in provider.Contents)
    {
        if (!string.IsNullOrEmpty(httpContent.Headers.ContentDisposition?.FileName))
        {
            var byteArray = await httpContent.ReadAsByteArrayAsync();
            //do whatever you need with byteArray
        }
    }

    var bridgeId = provider.FormData["bridgeId"];

    return Ok();
}

在客户端:

var request = {
    url: '/api/Bridge/UploadBridgeImage',
    data: {
        file:file,
        bridgeId:$scope.selectedBridge.BridgeID
    }
};

Upload.upload(request).then(function (response) {

});

关于c# - 使用 ng-file 的 AngularJS HTTP POST,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37914170/

相关文章:

c# - 使用 C# 从列表中删除最旧的 n 项

c# - 使用 linq 查询填充列表框 - 值未设置

AngularJS 单元测试目录结构最佳实践

c# - 从 Web API 操作使用 HttpClient 调用外部 HTTP 服务

c# - .Net Core WebAPI 连接重置,当我的 Controller 中有 "include"时

c# - ASP.Net MVC 将标签值回发到您的 Controller

javascript - 文本区域换行符不显示

javascript - 路由无法正常工作 AngularJS,只需添加哈希值

c# - 对 WCF 服务的异步调用不保留 CurrentCulture

c# - 如何在 Entity Framework 中使用 join 使输出 Json 对象分级别 - 不是同一级别