1

内部に画像を含む 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(.....);

しかし、これは非常に効率が悪いようです。文字列から画像を作成するより良い方法、文字列を受け取るより良い方法、または文字列を渡すより良い方法はありますか?

4

2 に答える 2

1

使用できますFile.WriteAllBytes

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

.を取得したら、名前空間MemoryStreamを通過する必要はまったくありません。System.Drawingbyte[]

于 2013-05-11T21:09:12.163 に答える
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);

...
}

数日間、これに対する答えを見つけることができませんでした。誰かの役に立てば幸いです。私が言ったように、最も効率的な解決策ではないかもしれませんが、うまくいきます。

于 2013-05-12T02:11:46.877 に答える