【问题标题】:How to convert base64 string to image binary file and save onto server [duplicate]如何将base64字符串转换为图像二进制文件并保存到服务器上[重复]
【发布时间】:2015-08-14 10:50:12
【问题描述】:

作为一个例子,我用一个调整大小的图像转换了一个画布元素,并发布到一个隐藏的输入字段中,该字段现在被编码为

data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD...

然后将该值发布到同一页面,我需要将该字符串转换为图像并保存到服务器上。

代码隐藏文件 (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);
            }

        }

我很确定我需要将图像数据转换为二进制文件,然后再保存到服务器上,但我不太明白我需要如何修改上面的代码。有任何想法吗?保存到服务器的代码不起作用。

一旦我将其转换为图像并按上述更改其名称 - 我将通过 LINQ 将其存储回数据库 - 并附加一个 URL。

任何帮助将不胜感激。

【问题讨论】:

  • 从技术上讲,不,这不是答案,因为我已经尝试过了,并且代码不起作用,因此我发布的原因。
  • 这里有任何错误/异常吗?
  • 我不太明白如何添加“代码” File.WriteAllBytes( Path.Combine (@"D:\apps\PJP_TEST\PJPTest\Online\ImageStorage\" , imgName ) , imageBytes ) ;
  • 我希望能够将编码转换为文件并保存到服务器(不是客户端)
  • 所以建议尽可能重复的链接是非常正确的。您只需要从字符串中获取编码部分并使用那里给出的答案。

标签: c# asp.net canvas file-upload character-encoding


【解决方案1】:

希望以下功能有所帮助。

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;
        }

编辑 1 -

从 cmets 看来,您正在获取 base64 字符串,您需要将其保存为服务器上的图像,然后在需要时需要使用物理服务器路径显示该图像。

好的。 Base64ToImage 将为您的 base64 字符串提供图像。您可以使用

将其保存在服务器上
image.Save("PATH", System.Drawing.Imaging.ImageFormat.Jpeg);

您提供或创建的这个“PATH”可以作为 URL 存储在 DB 中,您可以在显示时使用。

注意:确保您对保存图像的文件夹具有写入权限。

EDIT-2 您的函数应如下所示。请按要求放验证码、错误处理。

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);
   }

【讨论】:

  • 谢谢阿米特。我如何称呼它以包含在我上面的代码中?现在,我已经传递了一个已经从画布编码的图像,因此我只想将数据从postedFile转换为二进制图像并保存到服务器
  • 试试上面的功能。它会起作用的。你不需要删除数据:image/jpeg;base64....
  • 我只需要使用格式中已有的函数 Base64ToImage。那么返回图像的输出也会是文件名吗?
  • 我需要将它保存为二进制文件,然后根据我的代码重命名文件(我需要分配 GUID 作为文件名)
  • 当我使用您的代码@amit 时出现以下错误无法将类型“System.Drawing.Image”隐式转换为“System.Web.UI.WebControls.Image”这是我悬停时过度返回图像
猜你喜欢
  • 1970-01-01
  • 2010-11-10
  • 2013-02-15
  • 2021-08-18
  • 1970-01-01
  • 2021-10-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多