我有一个带有图像的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(.....);
但这似乎效率很低。有没有更好的方法从字符串创建图像,更好的方式来接收字符串,或更好的方式来传递字符串?
答案 0 :(得分:1)
您可以使用File.WriteAllBytes
:
byte[] imageBytes = Convert.FromBase64String(base64FileString);
File.WriteAllBytes(path, imageBytes);
获得MemoryStream
后,绝对无需通过System.Drawing
和byte[]
命名空间。
答案 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);
...
}
我几天都找不到答案。我希望它对某人有帮助。就像我说的,可能不是最有效的解决方案,但确实有效。