2009-09-28 9 views
1

J'ai créé une application WSSv3 qui télécharge des fichiers en petits morceaux; quand chaque élément de données arrive, je le conserve temporairement dans un champ de type de données d'image SQL 2005 pour des raisons de performance **.Téléchargement de fichiers volumineux dans WSS v3

Problème à venir lorsque le téléchargement se termine; J'ai besoin de déplacer des données de mon serveur SQL vers Sharepoint Document Library via le modèle d'objet WSSv3.

En ce moment, je ne peux penser à deux approches:

SPFileCollection.Add(string, (byte[])reader[0]); // OutOfMemoryException

et

SPFile file = folder.Files.Add("filename", new byte[]{ }); 
using(Stream stream = file.OpenBinaryStream()) 
{ 
    // ... init vars and stuff ... 
    while ((bytes = reader.GetBytes(0, offset, buffer, 0, BUFFER_SIZE)) > 0) 
    { 
     stream.Write(buffer, 0, (int)bytes); // Timeout issues 
    } 
    file.SaveBinary(stream); 
} 

Existe-t-il un autre moyen d'accomplir avec succès cette tâche? ** Raisons de performance: si vous essayez d'écrire chaque morceau directement à Sharepoint, vous remarquerez une dégradation des performances au fur et à mesure que le fichier grossit (> 100Mb).

+0

Quelle est la taille moyenne et maximale des fichiers? –

+0

la plupart des fichiers de moins de 5 Mo; gros fichiers (~ 500 Mo) sont juste un petit ensemble –

Répondre

1

j'ai fini avec le code suivant:


myFolder.Files.Add("filename", 
    new DataRecordStream(dataReader, 
     dataReader.GetOrdinal("Content"), length)); 

Vous pouvez trouver DataRecordStream implementation here. Il est essentiellement un Whos Stream lire les données à partir d'un DbDataRecord par .GetBytes

Cette approche est similaire à OpenBinaryStream()/SaveBinary(stream), mais il est doesnt conserve tous octet [] dans la mémoire pendant que vous transférez des données. Dans un certain point, DataRecordStream sera accessible à partir de Microsoft.SharePoint.SPFile.CloneStreamToSPFileStream en utilisant 64k morceaux.

Merci à tous pour vos précieuses informations!

0

La première chose que je dirais est que SharePoint est vraiment, vraiment pas conçu pour cela. Il stocke tous les fichiers dans sa propre base de données afin que ces fichiers volumineux soient utilisés. Ce n'est pas une bonne idée pour beaucoup de raisons: scalabilité, coût, sauvegarde/restauration, performance, etc ... Donc, je recommande fortement d'utiliser des partages de fichiers à la place.

Vous pouvez augmenter le délai d'expiration de la requête Web en modifiant l'attribut executionTimeout du httpRuntime element in web.config. En dehors de cela, je ne sais pas quoi d'autre à suggérer. Je n'ai pas entendu parler de fichiers aussi volumineux stockés dans SharePoint. Si vous devez absolument le faire, essayez également de demander au Server Fault.

+0

salut Alex, merci pour vos commentaires. Je suis conscient de ces problèmes: je construis une application wss pour le remplacement du partage réseau (principalement pour la restriction de la bande passante); Alors que les utilisateurs devraient utiliser cette application pour les petits fichiers, les grands doivent être considérés. Je n'ai pas de problèmes avec HttpRuntime, puisque je télécharge des fichiers en plusieurs morceaux –

0

Comme mentionné précédemment, le stockage de fichiers volumineux dans Sharepoint est généralement une mauvaise idée. Voir cet article pour plus d'informations: http://blogs.msdn.com/joelo/archive/2007/11/08/what-not-to-store-in-sharepoint.aspx

Cela dit, il est possible d'utiliser le stockage externe pour BLOBs, qui peut ou ne peut pas aider vos problèmes de performance - Microsoft a publié un fournisseur de stockage BLOB externe demi-complet fait l'affaire, mais cela fonctionne malheureusement au niveau de la ferme et affecte tous les téléchargements. Ick. Heureusement, puisque vous pouvez implémenter votre propre fournisseur BLOB externe, vous pouvez écrire quelque chose pour mieux gérer ces fichiers spécifiques. Voir cet article pour plus de détails: http://207.46.16.252/en-us/magazine/2009.06.insidesharepoint.aspx

Si cela vaut la peine ou non, cela dépend de la quantité de problème que vous rencontrez. :)

+0

Liens intéressants Brett, je vais les étudier attentivement; en ce moment je dois finir cette application de cette façon; ty pour votre temps –

+0

@Brett: Il existe une société qui a développé une solution complète de stockage externe pour SharePoint. Je ne me souviens pas du nom ou je ne le trouve pas maintenant ... Ça semble intéressant –