将img / image的HTML保存到磁盘

时间:2013-05-11 21:06:04

标签: c# javascript image upload base64

我有一个带有图像的div。在javascript中我得到div,并将div的innerHTML发送到服务器。 javascript在下面过于简单:

function uploadImage() {       
    var imageInfo = document.getElementById('divImage').innerHTML;
    PageMethods.uploadImage(imageInfo, onSuccess, onError);

} //end function

我目前在服务器上收到此字符串。

[WebMethod]
public static string uploadImage(string base64FileString){...}

结果如下:

<img height="150" width="150" title="name.png" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAA...../>

我需要将此图像保存到磁盘,我不知所措。我的理解是,我可以通过“base64”(使用拆分)获取所有内容并使用以下内容创建图像:

    // Convert Base64 String to byte[]
    byte[] imageBytes = Convert.FromBase64String(base64FileString);
    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);
    image.Save(.....);

但这似乎效率很低。有没有更好的方法从字符串创建图像,更好的方式来接收字符串,或更好的方式来传递字符串?

2 个答案:

答案 0 :(得分:1)

您可以使用File.WriteAllBytes

byte[] imageBytes = Convert.FromBase64String(base64FileString);
File.WriteAllBytes(path, imageBytes);

获得MemoryStream后,绝对无需通过System.Drawingbyte[]命名空间。

答案 1 :(得分:0)

我知道必须有更好的方法来做到这一点,但我有一个至少可行的解决方案。如果有人能够指出更复杂的方式,我会全神贯注。我会假设有某种对象可以在服务器上接收img以保存到磁盘,但可能没有。

Javascript和webmethod保持不变。我将div的InnerHTML传递给服务器,并将其作为字符串接受。在服务器上,我使用了多个分割(我理解为非常慢)来获取图像的base64部分。

[WebMethod]
public static string uploadImage(string base64FileString){

   //Get all of the text right of the comma
    string base64PartTemp= base64FileString.Split(',')[1];

    //The final part of the base64 had a \" to remove
    //Now base64PartFinal is the base64 part of the image only
    string base64PartFinal= base64PartTemp.Split('\"')[0];

    //Get all of the text to the right of the period from original string
    string fileTypePart = base64FileString.Split('.')[1];

    //Because the file is an image the file type will be 3 chars
    string fileType = fileTypePart.Substring(0, 3);

    //Use a new guid for the file name, and append the fileType
    string finalFileName = Guid.NewGuid() + "." + fileType;

    //Turn the final base64 part into byte array
    byte[] imageBytes = Convert.FromBase64String(base64PartFinal);

    //Get the working directory of the project to store the files
    string path= System.AppDomain.CurrentDomain.BaseDirectory.ToString();

    //Append that I want to put the image in the images folder, under a designated filename
    path += "Images/" + finalFileName;

    //Write the image to file
    File.WriteAllBytes(path, imageBytes);

...
}

我几天都找不到答案。我希望它对某人有帮助。就像我说的,可能不是最有效的解决方案,但确实有效。