c# - net - ¿La entrada no es una cadena Base-64 válida, ya que contiene un carácter no base 64?
frombase64string invalid length for a base 64 char array or string (3)
Tengo un formulario donde un usuario puede cargar un archivo en la sección de descarga de sitios. Sin embargo, cuando se envía el formulario, aparece este error, sin que la solicitud llegue al método de acción.
"La entrada no es una cadena de Base-64 válida, ya que contiene un carácter no básico de 64, más de dos caracteres de relleno o un carácter de espacio no blanco entre los caracteres de relleno"
Código:
[HttpPost]
[Authorize]
public ActionResult Create(Download dl, HttpPostedFileBase DownloadFile)
{
Y
@model Models.Download
@{
ViewBag.Title = "Add Download";
}
<h3>Add Download</h3>
@using (Html.BeginForm("Create", "Download", FormMethod.Post, new { enctype = "multipart/form-data" }))
{
@Html.ValidationSummary(true)
<div class="editor-label">Download File</div>
<div class="editor-field">
<input name="DownloadFile" id="DownloadFile" type="file" />
@Html.ValidationMessage("DownloadFile");
</div>
<div class="editor-label">@Html.LabelFor(model => model.Downloads)</div>
<div class="editor-field">
@Html.EditorFor(model => model.Downloads)
@Html.ValidationMessageFor(model => model.Downloads)
</div>
<div class="editor-label">@Html.LabelFor(model => model.DownloadDate)</div>
<div class="editor-field">
@Html.EditorFor(model => model.DownloadDate)
@Html.ValidationMessageFor(model => model.DownloadDate)
</div>
<div class="display-field"><input type="submit" value="Add" /></div>
}
<div>@Html.ActionLink("Back To Downloads", "Index")</div>
¿Alguna sugerencia?
Gracias, Alex.
Alex, estás parcialmente correcto con tu evaluación. La razón por la que falla cuando tiene una propiedad con el mismo nombre en su modelo que el nombre del objeto de entrada en el formulario se debe a que el DataType de la propiedad de nombre correspondiente en su modelo no es System.Web. HttpPostedFileWrapper, que es el tipo de datos con el que intentará realizar un enlace el binary-binder.
Excluir su propiedad mediante el uso del atributo Bind y luego extraer el archivo de la colección Request.Files como demostró que puede funcionar, pero puede ser más elegante dejar que el archivador haga su trabajo (siempre que el tipo de datos coincida como lo mencioné anteriormente) ) y luego simplemente puede acceder al archivo directamente desde la propiedad de su modelo
Ok, finalmente me di cuenta de que todo estaba provocado porque nombré la entrada del archivo en el formulario igual que en el campo de archivo de mi modelo, por lo que el archivador de modelo estaba recogiendo esto e intentando vincular el archivo publicado directamente a la propiedad binaria que estaba lanzando una excepción porque la cadena no era binaria.
Así que para solucionarlo simplemente agregué esto a mi método de creación de acción:
[HttpPost]
[Authorize]
public ActionResult Create([Bind(Exclude = "DownloadFile")] Download dl, HttpPostedFileBase DownloadFile)
{
Al indicar al cuaderno de modelos que excluya el campo, resolvió el problema.
Gracias, Alex.
EDITAR: Esto también podría resolverse fácilmente usando modelos de vista
Puede intentar eliminar HttpPostedFileBase del método del controlador y usar Request.Files [0] y ver si eso hace una diferencia.
Honestamente, aunque no veo por qué esto estaría fallando a menos que haya algo que lo esté causando dentro de su Modelo.
Además, la selección de nit aquí, pero DownloadFile debe descargarse en su formulario y en su método de control.