posts - 315, comments - 268, trackbacks - 15

My Links

News

View Pietro Libro's profile on LinkedIn

DomusDotNet
   DomusDotNet

Pietro Libro

Tag Cloud

Article Categories

Archives

Post Categories

Blogs amici

Links

Umbraco, importazione di file in Media

Con questo post inauguro (si fa per dire) una nuova sezione dedicata al CMS Open Source (scritto in C#) Umbraco. Durante questa settimana, abbiamo avuto la necessità di migrare un vecchio sito verso questa piattaforma, il problema principale è stato l'importazione di documenti PDF all'interno della sezione Media di Umbraco, e agganciare l'ID del nodo media  di ogni file, al rispettivo controllo MediaPicker per i rispettivi documenti nella sezione Content.  I  PDF erano situati in una struttura di directory e sottodirectory con un particolare significato. Volevo condividere un piccolo esempio d'importazione per due motivi: per ricordarmelo ;-) e perchè magari qualcuno potrebbe capitare nella mia stessa situazione, in fondo il CMS è open source, quindi mi sembra il minimo...

Supponiamo di avere in Media un Folder denominato Documentazione, il cui nodo ha ID 8734

image

Supponiamo di avere tra i Documet Types, un NodeType denominato PaginaMediaPicker, contenente un Tab denominato content con due proprietà: title (Textstring) e attach (MediaPicker):

image

Inoltre nella sezione Content, supponiamo di avere una nodo denominato Importazione con ID=8806. A questo punto non ci resta che eseguire l'importazione dei dati, per aggiungendo così i documenti PDF nella cartella Documenti PDF della sezione Media, sotto il nodo Documentazione, e i rispettivi documenti di Content (istanze di PaginaMediaPicker) sotto il nodo Importazione. Possiamo creare una classe per l'importazione dei dati, come ad esempio:

1 public class ImportMedia 2 { 3 private umbraco.BusinessLogic.User _user = null; 4 5 public ImportMedia(umbraco.BusinessLogic.User user) 6 { 7 _user = user; 8 } 9 10 /// <summary> 11 /// Crea un nuovo Folder in Media. Se la funzione ha successo, ritorna 12 /// l'id del nodo creato 13 /// </summary> 14 /// <param name="parentId">ID del Parent sotto il quale creare il folder</param> 15 /// <param name="nome">Nome del folder da creare</param> 16 /// <returns></returns> 17 public int MakeFolderMedia(int parentId, string folderName) 18 { 19 try 20 { 21 MediaType folderType = MediaType.GetByAlias("Folder"); 22 Media folder = Media.MakeNew(folderName, folderType, _user, parentId); 23 24 return folder.Id; 25 } 26 catch 27 { 28 return -1; 29 } 30 } 31 32 /// <summary> 33 /// Esegue la scansione ricorsiva della directory 34 /// </summary> 35 /// <param name="fullDirectoryPath">Percorso completo della directory contenente i documenti</param> 36 /// <param name="searchPattern">Pattern di ricerca dei file</param> 37 /// <param name="documentTypeName">Nome del tipo di documento (Document Type) da creare</param> 38 /// <param name="parentContentId">ID del nodo Content a cui aggiungere i nodi di tipo Content</param> 39 /// <param name="parentMediaId">ID del nodo Media a cui aggiungere i nodi documenti caricati</param> 40 public void ScanDirectory(string fullDirectoryPath, string searchPattern, 41 string documentTypeName, int parentContentId, int parentMediaId) 42 { 43 DirectoryInfo dInfo = new DirectoryInfo(fullDirectoryPath); 44 foreach (DirectoryInfo dir in dInfo.GetDirectories()) 45 { 46 ScanDirectory(dir.FullName, searchPattern, documentTypeName, parentContentId, parentMediaId); 47 } 48 49 foreach (FileInfo file in dInfo.GetFiles(searchPattern)) 50 { 51 MediaType fileType = MediaType.GetByAlias("File"); 52 //Crea un oggetto Media, lo inserisce nell'albero sotto il nodo con ID uguale a parentMediaId 53 Media m = Media.MakeNew(file.Name, fileType, _user, parentMediaId); 54 m.getProperty("umbracoFile").Value = UploadFile(file.FullName, 55 m.getProperty("umbracoFile").Id, 56 m.getProperty("umbracoFile").VersionId); 57 58 if (m.Id > 0) 59 MakeDocument(documentTypeName, file.Name, parentContentId, 60 new string[] { "title", "attach" }, 61 new string[] { file.Name, m.Id.ToString() } 62 ); 63 } 64 } 65 66 /// <summary> 67 /// Crea un nuovo documento 68 /// </summary> 69 /// <param name="documentTypeName">Nome del Document Type da creare</param> 70 /// <param name="documentName">Nome del documento</param> 71 /// <param name="parentContentId">ID del nodo Content a cui aggiungere i nodi di tipo Content</param> 72 /// <param name="properties">Nomi delle proprietà del Document Type che devono essere valorizzate</param> 73 /// <param name="values">Valori delle proprietà del Document Type </param> 74 /// <returns></returns> 75 private int MakeDocument(string documentTypeName, string documentName, int parentContentId, 76 string[] properties, string[] values) 77 { 78 79 DocumentType dt = DocumentType.GetByAlias(documentTypeName); 80 81 if (properties.Length == values.Length) 82 { 83 Document d = Document.MakeNew(documentName, dt, _user, parentContentId); 84 85 for (int index = 0; index < properties.Length; index++) 86 d.getProperty(properties[index]).Value = values[index]; 87 88 d.Publish(_user); 89 90 return d.Id; 91 } 92 else 93 { 94 throw new System.Exception("Wrong Data"); 95 } 96 } 97 98 99 private string UploadFile(string fullFilePath, int propertyID, System.Guid versionID) 100 { 101 //Code... 102 } 103 }

Il sorgente completo della classe ImportMedia è in allegato al post. Il codice sopra, può essere utilizzato, ad esempio in una Web Form, nel seguente modo:

1 User user = new User(0); 2 ImportMedia import = new ImportMedia(user); 3 4 //8734, ID del Parent nella sezione Media 5 int mediaParentId = import.MakeFolderMedia(8734, "Documenti PDF"); 6 if (mediaParentId > 0) 7 { 8 //8806, ID del Parent nella sezione Content 9 import.ScanDirectory(@"C:\Percorso_Cartella\PDFs", 10 "*.pdf", "PaginaMediaPicker", 8806, mediaParentId); 11 } 12 else 13 Response.Write("Errore nella creazione del folder in Media");

Una volta eseguito il codice, nella sezione Media, otterremo:

image

Mentre nel Content avremo:

image

Per la corretta esecuzione del codice, in un'applicazione web differente da quella di Umbraco, è necessario impostare correttamente il web.config.

La versione di Umbraco utilizzata è la 3.0.6.

Codice Completo della classe ImportMedia

 

Technorati Tag: ,

Print | posted on sabato 29 novembre 2008 22:17 | Filed Under [ CMS, Umbraco ]

Comments have been closed on this topic.

Powered by:
Powered By Subtext Powered By ASP.NET