无法在MVC操作方法上从base64string创建图像

时间:2017-02-13 14:59:39

标签: c# asp.net-mvc image-uploading filereader

我试图通过其内容在MVC控制器中上传图片。

$scope.imageUpload = function (event) {
        var files = event.target.files; //FileList object
        fileString = event.target.files[0];
        for (var i = 0; i < files.length; i++) {
            var file = files[i];
            var reader = new FileReader();
            reader.onload = $scope.imageIsLoaded;
            reader.readAsDataURL(file);
        }
    }
    $scope.imageIsLoaded = function (e) {
        $scope.$apply(function () {
            $scope.userProfilePic = e.target.result;
            $.ajax({
                url: "FileUploadWithAjax",
                type: "POST",
                data: 'imageString=' + e.target.result.split(',')[1],
                processData: false
            });
        });
    }

加载图像后,我将其内容发送给MVC控制器。

[System.Web.Mvc.HttpPost]
        public void FileUploadWithAjax([FromBody]string imageString)
        {
           bytes = Convert.FromBase64String(imageString);
            using (MemoryStream ms = new MemoryStream(bytes))
            {
                Image image = Image.FromStream(ms);
                image.Save("myBlargyImage.jpg");
            }
        }

但是从流中创建图像时它会破碎。 它会抛出一个名为&#34; Invalid parameter&#34;。

的错误
  

类型&#39; System.ArgumentException&#39;的例外情况发生在   System.Drawing.dll但未在用户代码中处理

     

附加信息:参数无效。

堆栈跟踪

  

at System.Drawing.Image.FromStream(Stream stream,Boolean   useEmbeddedColorManagement,Boolean validateImageData)at   System.Drawing.Image.FromStream(Stream stream)at   Micraft.BBraun.Controllers.EmployeeController.FileUploadWithAjax(字符串   imageString)在D:\ B Braun \ mvc 31 JAN   2017 \ Micraft.BBraun \ Controllers \ EmployeeController.cs:第351行   lambda_method(Closure,ControllerBase,Object [])at   System.Web.Mvc.ActionMethodDispatcher&LT;&GT; c__DisplayClass1.b__0(ControllerBase   controller,Object []参数)at   System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase   controller,Object []参数)at   System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext   controllerContext,IDictionary 2 parameters) at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary 2   参数)at   System.Web.Mvc.Async.AsyncControllerActionInvoker.b__39(IAsyncResult的   asyncResult,ActionInvocation innerInvokeState)at   System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult 2.CallEndDelegate(IAsyncResult asyncResult) at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResultBase 1.End()   在   System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethod(IAsyncResult的   asyncResult)at   System.Web.Mvc.Async.AsyncControllerActionInvoker.AsyncInvocationWithFilters.b__3d()   在   System.Web.Mvc.Async.AsyncControllerActionInvoker.AsyncInvocationWithFilters&LT;&GT; c__DisplayClass46.b__3f()

更新

我只是检查可以从base64string生成图像的在线工具 http://codebeautify.org/base64-to-image-converter

当我在html中复制源文件中的图像文本时,我能够在上面的网站上生成图像。

之后,我尝试复制我在服务器端方法获得的图像内容,令人惊讶的是我无法生成图像。

然后我比较了两篇文章,发现了一些不同之处

如果你仔细检查下面的图像,我可以看到一些变化,比如那里的任何地方&#34; +&#34;登录图像内容,将其替换为&#34;空格&#34;。

是否有任何我在将此数据发布到服务器时应该使用的内容类型?

Right side data are working(copied from client side - left side data are not working copied from server side method)

1 个答案:

答案 0 :(得分:0)

您需要对发送到服务器的数据使用encodeURIComponent()。因此,在您的ajax请求中,请执行以下操作:

data: 'imageString=' + encodeURIComponent(e.target.result.split(',')[1]),

请参阅AJAX POST and Plus Sign ( + ) -- How to Encode?