0

ASP.net (C#) Web アプリで、HTML 5 キャンバスと Java スクリプトを使用して署名パッドを作成しました。タッチ デバイス (Android および iOS) で署名をキャプチャしています。

署名が完了すると、データがキャンバスからサーバーに送信され、そこでデータが .bmp イメージに変換され、Bitmap.Save(location, Format) を使用してサーバーのルート プログラム ディレクトリにある署名ファイルというディレクトリに保存されます。 . これは、今まで何ヶ月もの間、いくつかのクライアントでうまく機能しています。

残念ながら、私は現在例外をキャッチしていますが、どこにも送信していません (現在修正に取り組んでいるという大きな間違いです)。必要に応じて、いくつかの例外出力を使用してコードを再コンパイルし、より多くの情報を取得できるようにしますが、新しいクライアントであるため、これをできるだけ早く修正できるようにしたいと考えています。また、コードは長い間問題なく動作しているため、私はそれがサーバー設定であることを楽観視しています。

IIS7 または Windows Server 2008 に、アプリがファイルをサーバーに保存するのをブロックしている可能性のあるセキュリティ設定がありますか。そうでない場合は、次のことを可能にするためにサーバーにインストールする必要があるものがあります。

byte[] imageBytes = Convert.FromBase64String(suffix);

MemoryStream ms = new MemoryStream(imageBytes, 0, imageBytes.Length);

ms.Write(imageBytes, 0, imageBytes.Length);

string thePath = Path.GetDirectoryName(saveLocation);

FileStream fs = new FileStream(thePath + @"\image.png", FileMode.Create);

BinaryWriter bw = new BinaryWriter(fs);

bw.Write(imageBytes);

bw.Close();

    if (string.IsNullOrEmpty(Path.GetFileName(saveLocation)))
        {

            string filename = Path.GetRandomFileName();
            filename = filename.Substring(0, filename.IndexOf('.'));
            filename = filename + Path.GetRandomFileName();
            filename = filename.Substring(0, filename.IndexOf('.'));

            theSaveLocation = saveLocation + @"\" + filename + "." + format;
        }


        ms = new MemoryStream();

        Bitmap input = (Bitmap)Bitmap.FromFile(thePath + @"\image.png");

        Bitmap result = ProcessBitmap(input, Color.White);

    result = (Bitmap)resizeImage((System.Drawing.Image)result, size);

    result.Save(theSaveLocation, System.Drawing.Imaging.ImageFormat.Bmp);

    input.Dispose();
        result.Dispose();
        ms.Close();

上記で使用したプロセスビットマップ関数は次のとおりです

private Bitmap ProcessBitmap(Bitmap bitmap, Color color)
{
    Bitmap temp = new Bitmap(bitmap.Width, bitmap.Height, System.Drawing.Imaging.PixelFormat.Format24bppRgb);
    Graphics g = Graphics.FromImage(temp);
    g.Clear(color);
    g.DrawImage(bitmap, Point.Empty);
    return temp;
}

上記で使用した resizeImage 関数は次のとおりです。

private static System.Drawing.Image resizeImage(System.Drawing.Image imgToResize, Size size)
{

    int sourceWidth = imgToResize.Width;
    int sourceHeight = imgToResize.Height;

    float nPercent = 0;
    float nPercentW = 0;
    float nPercentH = 0;

    nPercentW = ((float)size.Width / (float)sourceWidth);
    nPercentH = ((float)size.Height / (float)sourceHeight);

    if (nPercentH < nPercentW)
        nPercent = nPercentH;
    else
        nPercent = nPercentW;

    int destWidth = (int)(sourceWidth * nPercent);
    int destHeight = (int)(sourceHeight * nPercent);


    Bitmap b = new Bitmap(destWidth, destHeight);
    Graphics g = Graphics.FromImage((System.Drawing.Image)b);


    g.DrawImage(imgToResize, 0, 0, destWidth, destHeight);
    g.Dispose();

    return (System.Drawing.Image)b;
}
4

0 に答える 0