2017-07-28 110 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編碼。