1

ビューにファイルをアップロードする必要があります。HttpPostedFileBase を台無しにするのではなく、モデル バインドにバイト配列を使用できるようにするために、ByteArrayModelBinder を拡張して実装し、自動的に HttpPostFileBase を byte[] に変換することにしました。これが私がこれをした方法です:

public class CustomByteArrayModelBinder : ByteArrayModelBinder
{
    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
        {
            var file = controllerContext.HttpContext.Request.Files[bindingContext.ModelName];
     
            if (file != null)
            {
                if (file.ContentLength > 0)
                {
                    var fileBytes = new byte[file.ContentLength];
                    file.InputStream.Read(fileBytes, 0, fileBytes.Length);
                    return fileBytes;
                }
     
                return null;
            }
     
            return base.BindModel(controllerContext, bindingContext);
        }
    }

    protected void Application_Start()
    {
        ...
        ModelBinders.Binders.Remove(typeof(byte[]));
        ModelBinders.Binders.Add(typeof(byte[]), new CustomByteArrayModelBinder());
    }

上記を行った後、次のようなViewModelを持つことができるはずでした:

    public class Profile
{
    public string Name {get; set;}
    public int Age{get; set;}
    public byte[] photo{get; set;}
}

ビューで、対応する html 要素を次のように作成します。

@using (Html.BeginForm(null,null,FormMethod.Post,new { enctype = "multipart/form-data" })){
.........    
@Html.TextBoxFor(x=>x.photo,new{type="file"})
<input type="submit" valaue="Save">
}

しかし、フォームを送信すると、次のエラーが表示されます。

The input is not a valid Base-64 string as it contains a non-base 64 character, more than two padding characters, or a non-white space character among the padding characters.

実際、それは私の考えではありません。このリンクのガイドに従っています。実行が次の行で停止するため、何をすべきかわからない:

 return base.BindModel(controllerContext, bindingContext);

何をすべきか?

編集:コントローラーアクションメソッド:

 [HttpPost]
 public ActionResult Save(Profile profile){
     if(ModelIsValid){
        context.SaveProfile(profile);
     }
 }

しかし、アクションメソッドにさえ達していません。問題は、アクション メソッドの前に発生します。

4

1 に答える 1

1

base64 の変換中に、+ と / の文字が - と _ に変更されることがあります。したがって、それらを次のように置き換える必要があります。

string converted = base64String.Replace('-', '+');
converted = converted.Replace('_', '/');

あなたのBindModelクラスで。

于 2014-07-22T04:37:30.453 に答える