12
votes

Comment puis-je télécharger un fichier et enregistrer dans un flux pour un aperçu supplémentaire en utilisant c #?

Y a-t-il un moyen de télécharger un fichier, de le sauvegarder dans un flux, ce flux, je l'enregistrerai temporairement dans une session et, enfin, je vais essayer de prévisualiser ce fichier téléchargé dans cette session ??

Par exemple, un fichier PDF.

merci !!

édité

Voici ce que j'essaie de faire: < / p> xxx

et dans une autre méthode, je le fais: xxx

mais rien ne se passe ... mon navigateur s'ouvre même Une page NEM pour afficher le fichier PDF, mais une fenêtre est affichée indiquant que le fichier n'est pas un PDF (ou quelque chose comme le fichier ne déclenche pas avec PDF, je n'ai pas compris cela)


2 commentaires

Reportez-vous à mon exemple ci-dessous qui écrit le tableau d'octets en tant que fileresult. C'est plus sûr que la réponse.binarinywrite car vous utilisez ASPnet MVC. En outre, utilisez un meilleur lecteur de flux (voir mon édition ci-dessous) et entrez votre code pour vérifier que le fichier téléchargeé a réellement été largués dans la session. ;)


Le principal problème avec votre code est que vous ne lisez plus jamais à partir du flux d'entrée du tout. Vous créez un tampon de bonne taille, mais vous lisez dans le flux de mémoire vide dans le tampon au lieu du flux d'entrée. Ce que vous obtenez n'est qu'un tableau rempli de zéros, ce qui ne fonctionne évidemment pas comme fichier PDF.


3 Réponses :


15
votes

Bien sûr. Je télécharge des fichiers (pdf / images) vers My DB dans mon app . Mon objet de modèle stocke réellement le fichier sous forme de tableau d'octets, mais pour d'autres fonctions que je dois convertir et depuis des flux, donc je suis sûr que c'est tout aussi facile à maintenir en format de flux.

Voici quelques exemples de code (Copier N Coller) de mon application - p>

Le fichier code> objet code> que j'utilise pour déplacer des fichiers (pdfs / images) autour de: p> xxx pré>

. .Le pdfdoc code> Tapez spécifiquement pour les fichiers PDF: p> xxx pré>

.. Un exemple d'action qui reçoit un poste de plusieurs pièces pour le téléchargement de fichier: p> xxx pré>

Vous pouvez maintenant voir que je passe l'objet de fichier à mon service ici, mais vous pouvez choisir de l'ajouter à la session et de passer un identifiant à la vue "Aperçu" par exemple. P>

Enfin, voici une action générique que j'utilise pour rendant des fichiers sur le client (vous pouvez avoir quelque chose de similaire rendu les fichiers / flux de la session): p>

    /// <summary>
    /// Reads data from a stream until the end is reached. The
    /// data is returned as a byte array. An IOException is
    /// thrown if any of the underlying IO calls fail.
    /// </summary>
    /// <param name="stream">The stream to read data from</param>
    /// <param name="initialLength">The initial buffer length</param>
    public static byte[] ReadFully(System.IO.Stream stream, long initialLength)
    {
        // reset pointer just in case
        stream.Seek(0, System.IO.SeekOrigin.Begin);

        // If we've been passed an unhelpful initial length, just
        // use 32K.
        if (initialLength < 1)
        {
            initialLength = 32768;
        }

        byte[] buffer = new byte[initialLength];
        int read = 0;

        int chunk;
        while ((chunk = stream.Read(buffer, read, buffer.Length - read)) > 0)
        {
            read += chunk;

            // If we've reached the end of our buffer, check to see if there's
            // any more information
            if (read == buffer.Length)
            {
                int nextByte = stream.ReadByte();

                // End of stream? If so, we're done
                if (nextByte == -1)
                {
                    return buffer;
                }

                // Nope. Resize the buffer, put in the byte we've just
                // read, and continue
                byte[] newBuffer = new byte[buffer.Length * 2];
                Array.Copy(buffer, newBuffer, buffer.Length);
                newBuffer[read] = (byte)nextByte;
                buffer = newBuffer;
                read++;
            }
        }
        // Buffer is now too big. Shrink it.
        byte[] ret = new byte[read];
        Array.Copy(buffer, ret, read);
        return ret;
    }


3 commentaires

Thaaaaaanks Beaucoup de Cottsak! Ça a marché!! :-) Et j'ai aussi changé dans un fichier le résultat, pour être plus mvc! -)


@Cottsak merveilleux, mais si je souhaite afficher l'avancement de la chargement du (s) fichier (s), il n'a pas d'importance d'utiliser quelque chose aussi longtemps que possible dans le MVC3. J'espère que vous pourriez faire un échantillon. Merci


Je ne peux pas faire ça Ryan, désolé. Cela utilise les fonctions de téléchargement intégrées / natives de navigateurs pour chaque navigateur. Il n'y a pas d'API pour obtenir des progrès (que je sache). Chrome affiche toutefois un progrès en% pendant les téléchargements natifs.



2
votes

Oui, mais vous ne pouvez pas l'enregistrer dans un flux. Un flux ne contient aucune donnée, ce n'est que des moyens d'accéder au stockage réel.

Obtenez les données sous forme de tableau d'octets, vous pouvez la mettre dans une variable de session, le sauvegarder en tant que fichier et l'envoyer comme une réponse.

Utilisez un BinaryReader pour obtenir les données du flux d'entrée à un tableau d'octets: xxx

(modifier: modifié à partir d'un flux planteur à un BinaryReader)


4 commentaires

Data = Reader.Readtoend () ne fonctionnera pas car readtoend () renvoie une chaîne


@Andremiranda: Reportez-vous à mon édition ci-dessus. La lecture de flux peut être délicate


@AndreMiranda: Oui, tu as raison. Il suffit d'utiliser un binaryreader au lieu d'un streamerrisseur. Voir mon édition ci-dessus.


Super segment de code. Merci. Sur IIS, j'ai eu une exception hors de mémoire sur l'utilisation de Int.MaxValue. Remplacer par uploadedfilefile.inputtream.longueur a parfaitement fonctionné parfaitement



0
votes
byte[] data; 
using (Stream inputStream = PdfPath.InputStream) 
{ 
    MemoryStream memoryStream = inputStream as MemoryStream; 

    if (memoryStream == null) 
    { 
        memoryStream = new MemoryStream(); 
        inputStream.CopyTo(memoryStream); 
    } 

    data = memoryStream.ToArray(); 
}

0 commentaires