c# - asp - Cómo convertir cadena base64 a archivo binario de imagen y guardar en servidor
guardar imagen en sql server asp net c# (1)
Esta pregunta ya tiene una respuesta aquí:
- C # Base64 String to JPEG Image 4 respuestas
Como ejemplo, he convertido un elemento de lienzo con una imagen de nuevo tamaño y publicado en un campo de entrada oculto que ahora está codificado como
data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD...
Este valor luego se publicó en la misma página que necesito para convertir esta cadena en una imagen y guardarla en el servidor.
Código detrás del archivo (upload.aspx)
protected void btnUpload_Click(object sender, EventArgs e)
{
HttpPostedFile filePosted = Request.Files["newinput"];
string base64String = filePosted.ToString();
// Convert Base64 String to byte[]
byte[] imageBytes = Convert.FromBase64String(base64String);
MemoryStream ms = new MemoryStream(imageBytes, 0, imageBytes.Length);
// Convert byte[] to Image
ms.Write(imageBytes, 0, imageBytes.Length);
System.Drawing.Image image = System.Drawing.Image.FromStream(ms, true);
//I DONT KNOW HOW TO WRITE ABOVE INTO THE SaveAs CONDITION BELOW
if (filePosted != null && filePosted.ContentLength > 0)
{
string fileNameApplication = Path.GetFileName(filePosted.FileName);
string fileExtensionApplication = Path.GetExtension(fileNameApplication);
// generating a random guid for a new file at server for the uploaded file
string newFile = Guid.NewGuid().ToString() + fileExtensionApplication;
// getting a valid server path to save
string filePath = Path.Combine(Server.MapPath("~/Assets/") + Request.QueryString["id"] + "/", newFile);
if (fileNameApplication != String.Empty)
{
filePosted.SaveAs(filePath);
}
}
Estoy bastante seguro de que necesito convertir esto imagedata en un archivo binario antes de guardarlo en el servidor, pero no puedo entender cómo debo modificar el código anterior. ¿Algunas ideas? El código para guardar en el servidor no funciona.
Una vez que he convertido esto en una imagen y he cambiado su nombre como se indica arriba, lo estoy almacenando en una base de datos a través de LINQ, con una URL adjunta.
Cualquier ayuda sería muy apreciada.
La esperanza debajo de las funciones ayuda.
public string ImageToBase64(Image image,
System.Drawing.Imaging.ImageFormat format)
{
using (MemoryStream ms = new MemoryStream())
{
// Convert Image to byte[]
image.Save(ms, format);
byte[] imageBytes = ms.ToArray();
// Convert byte[] to Base64 String
string base64String = Convert.ToBase64String(imageBytes);
return base64String;
}
}
public Image Base64ToImage(string base64String)
{
// Convert Base64 String to byte[]
byte[] imageBytes = Convert.FromBase64String(base64String);
MemoryStream ms = new MemoryStream(imageBytes, 0,
imageBytes.Length);
// Convert byte[] to Image
ms.Write(imageBytes, 0, imageBytes.Length);
Image image = Image.FromStream(ms, true);
return image;
}
EDIT 1 -
Según los comentarios, parece que está obteniendo la cadena base64 y debe guardarla como imagen en el servidor y luego, cuando sea necesario, debe mostrar esa imagen usando la ruta física del servidor.
De acuerdo. Base64ToImage le dará una imagen para su cadena base64. Puede guardarlo en el servidor usando
image.Save("PATH", System.Drawing.Imaging.ImageFormat.Jpeg);
Y esta "RUTA" que ha suministrado o creado puede almacenarse en DB como URL, que puede usar en el momento de la visualización.
Nota: asegúrese de tener acceso de escritura a la carpeta donde está guardando la imagen.
EDIT-2 Su función debería verse a continuación. Por favor ponga código de validación, manejo de errores según sea necesario.
protected void btnUpload_Click(object sender, EventArgs e)
{
HttpPostedFile filePosted = Request.Files["newinput"];
string base64String = filePosted.ToString();
// Convert Base64 String to byte[]
byte[] imageBytes = Convert.FromBase64String(base64String);
MemoryStream ms = new MemoryStream(imageBytes, 0, imageBytes.Length);
// Convert byte[] to Image
ms.Write(imageBytes, 0, imageBytes.Length);
System.Drawing.Image image = System.Drawing.Image.FromStream(ms, true);
string newFile = Guid.NewGuid().ToString() + fileExtensionApplication;
string filePath = Path.Combine(Server.MapPath("~/Assets/") + Request.QueryString["id"] + "/", newFile);
image.Save(filepath,ImageFormat.Jpeg);
}