Image.FromStream (PostedFile.InputStream) échoue. (Le paramètre n'est pas valide.) (AsyncFileUpload))

StackOverflow https://stackoverflow.com/questions/1614773

Question

J'utilise un AsyncFileUpload (AJAX Toolkit) pour télécharger des images. J'ai un bouton qui gère le redimensionnement de l'image. Cela a bien fonctionné pendant un certain temps, mais plus maintenant.

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);

...
}

Autre chose que je trouve bizarre: si je tente une image dont la taille est inférieure à 80 Ko, cela fonctionne ..!

Nous avons essayé de redémarrer le serveur, mais aucun changement. Le même code fonctionne correctement sur ma machine. (entendu ça avant ?? :))

J'ai également essayé de sauvegarder le fichier sur le serveur, puis de récupérer le fichier dans Image.FromFile (), mais le message "Impossible d'accéder à un fichier fermé" s'affiche.

Comment résoudre ce problème?

Autres conseils

Ceci est correct, cela ne fonctionnera pas. Le problème est que vous traversez une limite gérée / non gérée, j'ai récemment rencontré la même chose. Un autre problème est que le flux n’est pas directement là et que Image.FromStream n’a aucune idée de la façon de le gérer.

La solution est assez simple: lisez tout du contenu de PostedFile dans un MemoryStream (utilisez simplement new MemoryStream () ) et utilisez MemoryStream avec le Image.FromStream . Cela résoudra votre problème.

Veillez à utiliser correctement à l'aide de lorsque vous travaillez avec Image , Graphiques et Stream . Tous implémentent IDisposable et dans un environnement ASP.NET, sans utiliser correctement en utilisant , peuvent et vont conduire à une utilisation accrue de la mémoire et à d’autres effets pervers sur le long terme (et les applications ASP.NET Courez très longtemps!).

La solution devrait ressembler à ceci:

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.
    }
}

Mise à jour : le problème de limite de franchissement des frontières gérées se produit uniquement à l'inverse (à l'aide du flux de réponse), semble-t-il, pas avec les flux de téléchargement, mais je ne suis pas tout à fait sûr.

scroll top