2

画像をアップロードするための Web サービスを備えた asp.net 4.0 Web アプリケーションを作成します。モバイル アプリから Web サービスに Base64 文字列の形式で画像を送信して、画像をアップロードしています。

以下は私のコードです:

public string Authenticate(string username, string password, string fileID, string imageData)
    {
        Dictionary<string, string> responseDictionary = new Dictionary<string, string>();
        bool isAuthenticated = true; // Set this value based on the authentication logic

        try
        {
            if (isAuthenticated)
            {
                UploadImage(imageData);

                string result = "success";
                var message = "Login successful";

                responseDictionary["status"] = result;
                responseDictionary["message"] = message;
            }
        }
        catch (Exception ex)
        {

            responseDictionary["status"] = ex.Message;
            responseDictionary["message"] = ex.StackTrace;
        }

        return new JavaScriptSerializer().Serialize(responseDictionary);
    }

    private void UploadImage(string uploadedImage)
    {
        // Convert Base64 String to byte[]
        byte[] imageBytes = Convert.FromBase64String(uploadedImage);
        MemoryStream ms = new MemoryStream(imageBytes, 0, imageBytes.Length);

        System.Drawing.Bitmap bitmap = (System.Drawing.Bitmap)Image.FromStream(ms);

        string uploadPath = Server.MapPath("..\\uploads\\") + DateTime.Now.Ticks.ToString() + ".jpeg";
        ms.Close();

        bitmap.Save(uploadPath, System.Drawing.Imaging.ImageFormat.Jpeg);
        bitmap.Dispose();
    }    

このコードはローカルの ASP.NET 開発サーバーで正常に動作し、「アップロード」ディレクトリにアップロードされた画像を確認できました。ただし、コードを FTP ディレクトリに転送した後、次のエラーが表示されるようになりました。

A generic error occurred in GDI+

ダミーの .aspx ページを作成し、page_load にテキスト ファイルを作成して、アップロード ディレクトリに適切なアクセス許可があることを確認しましたが、正常に動作します。

Google検索を行った後でも、この問題を解決できませんでした。誰でもこれを修正するのを手伝ってもらえますか?

よろしくお願いします。

4

2 に答える 2

6

ファイルに直接書き込む代わりに、ビットマップを にMemoryStream保存してから、ストリームの内容をディスクに保存します。これは古くから知られている問題であり、率直に言って、なぜそうなったのか詳細をすべて覚えているわけではありません。

 MemoryStream mOutput = new MemoryStream();
 bmp.Save( mOutput, ImageFormat.Png );
 byte[] array = mOutput.ToArray();

 // do whatever you want with the byte[]

あなたの場合、それはどちらかである可能性があります

private void UploadImage(string uploadedImage)
{
    // Convert Base64 String to byte[]
    byte[] imageBytes = Convert.FromBase64String(uploadedImage);

    string uploadPath = Server.MapPath("..\\uploads\\") + DateTime.Now.Ticks.ToString() + ".jpeg";

    // store the byte[] directly, without converting to Bitmap first 
    using ( FileStream fs = File.Create( uploadPath ) )
    using ( BinaryWriter bw = new BinaryWriter( fs ) )
       bw.Write( imageBytes );
}    

また

private void UploadImage(string uploadedImage)
{
    // Convert Base64 String to byte[]
    byte[] imageBytes = Convert.FromBase64String(uploadedImage);
    MemoryStream ms = new MemoryStream(imageBytes, 0, imageBytes.Length);

    System.Drawing.Bitmap bitmap = (System.Drawing.Bitmap)Image.FromStream(ms);

    string uploadPath = Server.MapPath("..\\uploads\\") + DateTime.Now.Ticks.ToString() + ".jpeg";
    ms.Close();

    // convert to image first and store it to disk
    using ( MemoryStream mOutput = new MemoryStream() )
    {  
        bitmap.Save( mOutput, System.Drawing.Imaging.ImageFormat.Jpeg);
        using ( FileStream fs = File.Create( uploadPath ) )
        using ( BinaryWriter bw = new BinaryWriter( fs ) )
            bw.Write( mOutput.ToArray() );
    }
}    
于 2011-10-08T18:22:07.783 に答える