【问题标题】:AngularJS angular-file-upload cannot upload data to WebAPI 2 CORSAngularJS angular-file-upload 无法将数据上传到 WebAPI 2 CORS
【发布时间】:2015-03-24 10:11:27
【问题描述】:

我正在尝试使用 https://github.com/danialfarid/angular-file-upload 将图像上传到我在不同域中的 webAPI。

我的 HTML:

<input 
    type="file" 
    ng-file-select="onFileSelect($files)"
    ng-model="imgData" 
    accept="image/*" 
    ng-click="test()" >

我的控制器:

app.controller('userController', [ 'removed', '$upload',
function (removed, $upload) {

    $scope.onFileSelect = function ($files) {
        console.log('onFileSelect');  // --------- THIS METHOD DOES NOT FIRE
        $http.post(serviceBase + 'api/person/image', data, {
            withCredentials: true,
            transformRequest: angular.identity
        }).success('ok').error('fail');
    }
    // tried different things from all the resources found online:
    $scope.test = function () {

        // THIS WORKS but how to get the file??
        // successfull call to controller method but unable to retrieve image file inside controller
        $http.post(serviceBase + 'api/person/image', data).then(function (response) {
            return response;
        });

        // unable to call controller method ('Resourse not found', CORS issue?)
        $scope.upload = $upload.upload({
            url: 'person/image', 
            headers: { 'Authorization': 'bearer placeHolderText' },
            file: $scope.imgData,
            ) };

        // unable to call controller method ('Resourse not found', CORS issue?)
        $http.post(serviceBase + 'api/person/image', data, {
            withCredentials: true,
            transformRequest: angular.identity
        }).success('ok').error('fail');}}

API 控制器方法:

    [HttpPost()]
    [ActionName("image")]
    [ResponseType(typeof(JObject))]
    public async Task<IHttpActionResult> Postimage(HttpPostedFileBase file)
    {

**更新:启用 CORS 详细信息... (Microsoft.Owin.Cors) **

我的 Startup.cs:

  public void Configuration(IAppBuilder app)
    {
        HttpConfiguration config = new HttpConfiguration();

        ConfigureOAuth(app);

        WebApiConfig.Register(config);
        app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);
        app.UseWebApi(config);
    }

    public void ConfigureOAuth(IAppBuilder app)
    {
        //use a cookie to temporarily store information about a user logging in with a third party login provider
        app.UseExternalSignInCookie(Microsoft.AspNet.Identity.DefaultAuthenticationTypes.ExternalCookie);
        OAuthBearerOptions = new OAuthBearerAuthenticationOptions();

        OAuthAuthorizationServerOptions OAuthServerOptions = new OAuthAuthorizationServerOptions() {

            AllowInsecureHttp = true,
            TokenEndpointPath = new PathString("/token"),
            AccessTokenExpireTimeSpan = TimeSpan.FromMinutes(30),
            Provider = new SimpleAuthorizationServerProvider(),
            RefreshTokenProvider = new SimpleRefreshTokenProvider()
        };

这很可能是 CORS 问题,因为我可以使用 $HTTP.Post 发布到该控制器方法。我在服务器上启用了 CORS。我已经阅读和尝试了两天的东西,但我遇到了困难,非常感谢任何建议/建议。

更新 2:

又是一天的研究/试错:

我可以发这个:

        $scope.upload = $upload.upload({
            url: 'http://localhost:26264/api/person/image', //upload.php script, node.js route, or servlet url
            file: $scope.imgData,
            transformRequest: angular.identity,
            headers: { 'Content-Type': undefined }

但现在我从提琴手那里得到“415(不支持的媒体类型)”.. 详细信息:

"此资源不支持请求实体的媒体类型 'multipart/form-data'。","exceptionMessage":"没有 MediaTypeFormatter 可用于从媒体类型为 'multipart' 的内容中读取类型为 'HttpPostedFileBase' 的对象/form-data'。”

【问题讨论】:

  • 你是如何启用 cors 的?是否安装了nuget包Microsoft.AspNet.WebApi.Cors,在webapi配置中添加config.EnableCors();,然后在控制器中添加[EnableCors(origins: "http://mywebclient.azurewebsites.net", headers: "*", methods: "*")]?
  • 我正在使用 Microsoft.Owin.Cors 所以我没有 [EnableCors(origins: "mywebclient.azurewebsites.net", headers: "", methods: "") ] 可供我使用。我被困住了,请帮忙!!

标签: javascript angularjs asp.net-web-api file-upload


【解决方案1】:

我最终使用了ng-flow,Images Sample 帮助进行了设置。 我还使用this 来了解如何读取控制器中的数据,最后使用this 来保存我的文件。最终解决方案:

控制器:

    [HttpPost()]
    [ActionName("image")]
    [ResponseType(typeof(JObject))]
    public async Task<IHttpActionResult> Postimage()
    {
        // Check if the request contains multipart/form-data.
        if (!Request.Content.IsMimeMultipartContent())
        {
            throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType);
        }

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

        try
        {
            // Read the form data.
            await Request.Content.ReadAsMultipartAsync(provider);

            // This illustrates how to get the file names.
            foreach (MultipartFileData file in provider.FileData)
            {
                //Console.WriteLine(file.Headers.ContentDisposition.FileName);
                //Trace.WriteLine("Server file path: " + file.LocalFileName);
                if (File.Exists(Path.Combine(root, "test.jpg")))
                    File.Delete(Path.Combine(root, "test.jpg"));

                File.Move(file.LocalFileName, Path.Combine(root, "test.jpg"));
                return Ok();
            }
        }
        catch (System.Exception e)
        {
        }
        return Ok();
    }

角度:

app.config(['flowFactoryProvider', function (flowFactoryProvider) {
    flowFactoryProvider.defaults = {
        target: 'myURL',
        permanentErrors: [404, 500, 501],
        maxChunkRetries: 1,
        chunkRetryInterval: 5000,
        simultaneousUploads: 4,
        singleFile: true
    };
    flowFactoryProvider.on('catchAll', function (event) {
        console.log('catchAll', arguments);
    });
    // Can be used with different implementations of Flow.js
    // flowFactoryProvider.factory = fustyFlowFactory;
}]);

HTML:

<div class="form-horizontal" role="form" flow-init
   flow-file-added="!!{png:1,gif:1,jpg:1,jpeg:1}[$file.getExtension()]"
   flow-files-submitted="$flow.upload()">

<span class="btn-success" flow-btn>Upload Image</span>
</div>

【讨论】:

  • 当我尝试使用您的解决方案时,文件File.Move(file.LocalFileName, Path.Combine(root, "test.jpg"));,我收到错误进程无法访问该文件,因为它正在被另一个进程使用。你能帮忙吗?
猜你喜欢
  • 2016-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-19
  • 1970-01-01
  • 1970-01-01
  • 2018-07-30
  • 2017-02-27
相关资源
最近更新 更多