将图像写入文件夹(ASP.NET MVC)

时间:2017-07-28 10:17:11

标签: c# asp.net .net asp.net-mvc

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

这是我的代码

 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}

我在请求中发送了两个参数。带有64位sting的ImgStr和带有静态名称的ImgName - 测试。

但我有这个

  

{"消息":"发生错误。"," ExceptionMessage":"输入不是有效的Base-64字符串因为它包含一个非基本的64个字符,两个以上的填充字符,或填充字符中的非法字符。 "" ExceptionType":" System.FormatException""堆栈跟踪":"在System.Convert.FromBase64_Decode(Char * startInputPtr,Int32 inputLength,Byte * startDestPtr,Int32 destLength)\ r \ n在System.Convert.FromBase64CharPtr(Char * inputPtr,Int32 inputLength)\ r \ n在System.Convert.FromBase64String处(字符串s)\ r \ n位于C:\ Users \ nemes \ Documents \ Visual Studio 2017 \ Projects \ trackingappbackend \ trackingappbackend \ Controllers \ ImageController.cs中的trackingappbackend.Controllers.ImageController.SaveImage(String ImgStr,String ImgName):第29行\ r \ n at lambda_method(Closure,Object,Object [])\ r \ n在System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor。<> c__DisplayClass10.b__9(Object instance,Object [] methodParameters)\ r \ n \ n at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.Execute(Object instance,Object [] arguments)\ r \ n在System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ExecuteAsync(HttpControllerContext controllerContext,IDictionary`2 arguments,取消语音取消语句)\ r \ n --- E.从抛出异常的先前位置的堆栈跟踪的nd --- \ r \ n在System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)\ r \ n在System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务) \ r \ n在System.Web.Http.Controllers.ApiControllerActionInvoker.d__0.MoveNext()\ r \ n ---从抛出异常的上一个位置的堆栈跟踪结束--- \ r \ n在System.Runtime。 System.Web.Http.Controllers.ActionFilterResult.d__2.MoveNext()\ r \的System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)\ r \ n中的CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)\ r \ n n ---从抛出异常的上一个位置开始的堆栈跟踪结束---在System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)\ r \ n的系统.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification中的\ r \ n (任务任务)\ r \ n在System.Web.Http.Dispatcher.HttpControllerDispa tcher.d__1.MoveNext()"}

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

哪里有问题?

3 个答案:

答案 0 :(得分:0)

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

在您的情况下,例外说:

  

两个以上的填充字符,或填充字符中的非法字符。

答案 1 :(得分:0)

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

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

在HTTP中执行此操作的标准方法是将消息体中的图像作为字节进行PUT / POST,使用正确的ContentType为" image / jpeg",因此根本不需要base64编码。

答案 2 :(得分:-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);