Pregunta

Estoy usando un AsyncFileUpload (AJAX Toolkit) para cargar imágenes. Tengo un botón que maneja el cambio de tamaño de la imagen. Esto ha funcionado bien durante algún tiempo, pero ya no ...

protected void BtnUploadImage_Click(object sender, EventArgs e)
{
    var imageFileNameRegEx = new Regex(@"(.*?)\.(jpg|jpeg|png|gif)<*>quot;, 
        RegexOptions.IgnoreCase);
    if (!AsyncFileUpload1.HasFile || 
        !imageFileNameRegEx.IsMatch(AsyncFileUpload1.FileName))
    {
        AsyncFileUpload1.FailedValidation = true;
        ErrorLabel.Visible = true;
        return;
    }
    ErrorLabel.Visible = false;

    var file = AsyncFileUpload1.PostedFile.InputStream;

    var img = Image.FromStream(file, false, false);

...
}

Otra cosa que me parece extraña: si intento una imagen de menos de 80 kb, ¡funciona ...!

Hemos intentado reiniciar el servidor, pero ningún cambio. El mismo código funciona bien en mi máquina. (escuché eso antes ?? :))

También intenté guardar el archivo en el servidor, luego obtener el archivo a través de Image.FromFile (), pero luego obtengo " No puedo acceder a un archivo cerrado. "

¿Cómo resolver esto?

Otros consejos

Esto es correcto, no funcionará. El problema es que estás cruzando un límite administrado / no administrado, recientemente encontré el mismo. Otros problemas son que la transmisión no está directamente allí y que Image.FromStream no tiene idea de cómo tratarla.

La solución es bastante sencilla: lea todo, desde PostedFile a MemoryStream (solo use new MemoryStream () ) y use MemoryStream con Image.FromStream . Esto resolverá tu problema.

Asegúrese de hacer un uso adecuado de utilizando cuando trabaje con Image , Graphics y Stream s. Todos ellos implementan el IDisposable y en un entorno ASP.NET, no usar los bloques utilizando correctamente, pueden y conducirán a un mayor uso de memoria y otros efectos secundarios desagradables en el largo plazo (y aplicaciones ASP.NET corre muy largo!).

La solución debería tener este aspecto:

using(Stream memstr = new MemoryStream())
{
    // copy to a memory stream
    Stream uploadStream = AsyncFileUpload1.PostedFile.InputStream;
    byte[] all = new byte[uploadStream.Length];
    uploadStream.Read(all, 0, uploadStream.Length);
    memstr.Write(all, 0, uploadStream.Length);
    memstr.Seek(0, SeekOrigin.Begin);
    using(Graphics g = Graphics.FromStream(memstr))
    {
         // do your img manipulation, or Save it.
    }
}

Actualización: el problema del límite administrado de cruce solo se produce al revés (usando el flujo de respuesta), no con las corrientes de carga, pero no estoy del todo seguro.

scroll top