尝试使用 AngularJS 将图像上传到 Cloudinary 时,Access-Control-Allow-Origin 不允许来源 http://localhost.com:8000

Posted

技术标签:

【中文标题】尝试使用 AngularJS 将图像上传到 Cloudinary 时,Access-Control-Allow-Origin 不允许来源 http://localhost.com:8000【英文标题】:Origin http://localhost.com:8000 is not allowed by Access-Control-Allow-Origin when trying to upload image to Cloudinary using AngularJS 【发布时间】:2017-07-25 09:03:13 【问题描述】:

我正在尝试使用我的 Angular 控制器将图像上传到 Cloudinary。请求未签名,我没有使用任何库。它只是一个简单的 POST 请求,当我在静态 html 页面上使用 jQuery 尝试它时,它起作用了

不管怎样,这是我的控制器:

myapp.controller('DashboardController', ['$scope', '$http', function($scope, $http) 

    $scope.uploadPicture = function() 
        var formData = new FormData();
        var file = document.getElementById("file").files[0];

        formData.append("file", file);
        formData.append("upload_preset", "[MY UNSIGNED UPLOAD PRESET]");

        $http(
            method: 'POST',
            url: 'https://api.cloudinary.com/v1_1/[MY CLOUD NAME]/image/upload',
            data: formData,
        ).then(function successCallback(response) 
            alert(respose.secure_url);
        , function errorCallback(response) 
            console.log(response);
            alert(response);
        );
    ;

]);

我得到的错误如下:

XMLHttpRequest cannot load https://api.cloudinary.com/v1_1/[MY CLOUD NAME]/image/upload. Origin http://localhost.com:8000 is not allowed by Access-Control-Allow-Origin.

为什么会出现此错误?请提供任何帮助。重复我之前所说的,这段用 jQuery 编写的确切代码在名为 index.html 的静态页面上完美运行,所以我有点迷失在这个问题上。

这是 jQuery 代码:

(function() 
        $('#uploadBtn').click(function() 
            var formData = new FormData();
            var file = document.getElementById("file").files[0];

            console.log(file);

            formData.append("file", file);
            formData.append("upload_preset", "[MY UNSIGNED UPLOAD PRESET]");

            $.ajax(
                url: "https://api.cloudinary.com/v1_1/[MY CLOUD NAME]/image/upload",
                type: 'post',
                data: formData,
                contentType: false,
                processData: false,
                success: function( response )
                    alert(response.secure_url);
                ,
                error: function( jqXhr, textStatus, errorThrown )
                    console.log( errorThrown );
                
            );
        );
    )();

<input type="file" id="file"/>
<button id="uploadBtn">Upload</button>

以上所有内容都在一个名为 index.html 的静态 html 文件中。

【问题讨论】:

看起来像服务器端错误。是否启用了 CORS? @suraj 我相信是这样,因为正如我之前所说,这适用于静态 html 页面。 “当我在静态 html 页面上使用 jQuery 尝试它时,它起作用了” 显示该代码。另外,当您这样做时,包含该 jQuery 代码的确切源页面 URL 是什么? @T.J.Crowder 更新帖子。 再次:您提出请求时的确切 URL 是什么? 【参考方案1】:

我怀疑您使用的浏览器 不是 Chrome,而是从文件系统而不是 Web 服务器进程运行“静态 HTML”页面;例如,来自 file:// URL 而不是 http:// URL(例如您的 Angular 示例中的 http://localhost:8000)。

不同的浏览器对待file:// URL 的方式不同。有些人,比如 Chrome,得出结论 no 跨域调用对于 file:// URL 是有效的(甚至其他 file:// URL 也不能可靠地被认为是同一来源),但其他一些浏览器采用一种非常不同的方法,并考虑 file:// URL 完全不受同源策略的约束,允许它们查询任何内容。

所以区别不是 Angular 与 jQuery,区别在于 file:// URL 与 http:// URL。所有http://(和https://)URL 都受到所有浏览器的SOP。

如果我是正确的,问题是您尝试发布的服务不允许来源localhost:8000

【讨论】:

【参考方案2】:

试试这个,

$httpProvider.defaults.withCredentials = true;
$httpProvider.defaults.useXDomain = true;
$httpProvider.defaults.headers.common['Access-Control-Allow-Origin'] = "*";
$httpProvider.defaults.headers.common['Access-Control-Allow-Methods'] = "POST, GET, OPTIONS, PUT, PATCH";
$httpProvider.defaults.heade`enter code here`rs.common['Access-Control-Allow-Headers'] = "Origin, Content-Type, Accept, Authorization";

我在从本地运行我的应用程序时遇到了类似的问题,并通过添加这些标头来解决它。

【讨论】:

以上是关于尝试使用 AngularJS 将图像上传到 Cloudinary 时,Access-Control-Allow-Origin 不允许来源 http://localhost.com:8000的主要内容,如果未能解决你的问题,请参考以下文章

如何在angularjs中使用ng-file上传裁剪和上传图像

尝试将文件(图像)上传到服务器时出现错误 403

将图像上传到服务器不会返回任何数据

使用 ASP.NET Core Web API 将图像上传到 Cloudianary 时出现空文件错误

使用 angularjs 将图像传递到后端

如何在angularjs上传图像时自动压缩图像