2017-07-28 140 views
-1

我有WebAPI项目,需要从移动应用程序获取图像并将其写入文件夹。将图像写入文件夹(ASP.NET MVC)

这里是我的代码

public class ImageController : ApiController 
{ 
    public bool SaveImage(string ImgStr, string ImgName) 
    { 
     String path = HttpContext.Current.Server.MapPath("~/Image"); //Path 

     //Check if directory exist 
     if (!System.IO.Directory.Exists(path)) 
     { 
      System.IO.Directory.CreateDirectory(path); //Create directory if it doesn't exist 
     } 

     string imageName = ImgName + ".jpg"; 

     //set the image path 
     string imgPath = Path.Combine(path, imageName); 

     byte[] imageBytes = Convert.FromBase64String(ImgStr); 

     File.WriteAllBytes(imgPath, imageBytes); 

     return true; 
    } 
} 

这里是我的网址,我在API选项卡

http://localhost:55341/api/Image?ImgStr={ImgStr}&ImgName={ImgName}

看到我在请求中发送两个参数。 ImgStr与基地64 sting和ImgName与静态名称 - 测试。

但是我有此

{“消息”:“发生错误”,“ExceptionMessage”:“输入是不是一个有效的Base-64字符串,因为它含有非基部64字符,超过两个填充字符或填充字符中的非法字符。“,”ExceptionType“:”System.FormatException“,”StackTrace“:”at System.Convert.FromBase64_Decode(Char * startInputPtr,Int32 inputLength,Byte *在System.Convert.FromBase64String(String s)处的System.Convert.FromBase64CharPtr(Char * inputPtr,Int32 inputLength)处的\ r \ n \ trackingAppbackend.Controllers.ImageController.SaveImage(字符串ImgStr,字符串ImgName)在C:\ Users \ nemes \ Documents \ Visual Studio 2017 \ Projects \ trackingappb ackend \ trackingappbackend \ Controllers \ ImageController.cs:line 29 \ r \ n at lambda_method(Closure,Object,Object [])\ r \ n at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor。在System.Web上的System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.Execute(Object instance,Object [] arguments)\ r \ n下的c__DisplayClass10.b__9(Object instance,Object [] methodParameters)\ r \ n。 Http.Controllers.ReflectedHttpActionDescriptor.ExecuteAsync(HttpControllerContext controllerContext,IDictionary`2参数,CancellationToken cancellationToken)\ r \ n ---来自之前引发异常的位置的堆栈跟踪结束--- \ r \ n在System.Runtime.CompilerServices .TaskAwaiter.ThrowForNonSuccess(任务任务)\ r \ n在System.Web.Http.Controllers.ApiControllerActionInvoker.d__0.MoveNext()\ r \ n System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)\ r \ n ---从以前位置抛出异常的堆栈跟踪结束---在System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)上的\ r \ n在System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务ta sk)\ r \ n在System.Web.Http.Controllers.ActionFilterResult.d__2.MoveNext()\ r \ n ---从前一位置抛出异常的堆栈跟踪结束--- \ r \ n在System。 Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)\ r \ n在System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)\ r \ n在System.Web.Http.Dispatcher.HttpControllerDispatcher.d__1.MoveNext()“ }

但我发送有效的base64字符串。

哪里有问题?

+0

我不会传递一个图像作为一个url参数,有一个依赖于浏览器的大小限制。使用post参数更好,它也会让你解决编码问题。尝试一下,看看你是否得到了更好的结果 – Slicksim

回答

-1

您可以将以下代码转换成base64tsring的图像和平代码。

byte[] bytes = Convert.FromBase64String(base64String); 

    Image image; 
    using (MemoryStream ms = new MemoryStream(bytes)) 
    { 
     image = Image.FromStream(ms); 
    } 

    image.Save(fullOutputPath+imagename, System.Drawing.Imaging.ImageFormat.Png); 
0

Base64的字符串可包含 “+”, “=” 和 “/”,这是在不查询字符串的有效字符。我认为你不应该在查询字符串中将Image作为base64传递。尝试使用post/put的身体。

在你的情况,异常说:

两个以上的填充字符或填充字符之间的非法字符。

0

正如其他提到的,一个问题是base64字符和URL分隔符之间的干扰,我猜这是在这里的罪魁祸首。这可以通过URL编码来解决。

您可能遇到的下一个问题是URL的长度有限。

在HTTP中执行此操作的标准方式是将消息正文中的图像作为字节PUT/POST,并带有适当的ContentType“image/jpeg”,因此根本没有base64编码。