Extension de modification SPFile SharePoint sur l'élément existant possible?
-
28-10-2019 - |
Question
Je suis à bout de nerfs sur celui-ci.J'ai une interface utilisateur qui crée et modifie des documents stockés dans une bibliothèque de documents SharePoint.La partie astuce est que je dois permettre à l'utilisateur de mettre à jour le document sans problème, utilisez simplement SPFile.SaveBinary()
, n'est-ce pas?
Cela met définitivement à jour le contenu du fichier, mais d'une manière ou d'une autre, l'ancien nom de fichier et l'ancienne extension persistent, c'est un problème.La suppression et la réajout de l'élément de liste n'est pas non plus une solution car l'ID de l'élément est référencé dans l'url.
Ma question est de savoir comment puis-je mettre à jour les métadonnées d'extension et de nom de fichier de l'élément SPFile?
Jusqu'à présent, toutes mes tentatives d'utilisation de la bibliothèque d'objets ont échoué, j'ai essayé de mettre à jour les champs ci-dessous aucun n'a réussi.Il semble qu'il doit y avoir un moyen plus simple de le faire.
SPFile file = item.File;
file.Item[SPBuiltInFieldId.FileLeafRef] = resolvedFileName;
file.Item[SPBuiltInFieldId.FileRef] = "/File/" + resolvedFileName;
file.Item[SPBuiltInFieldId.BaseName] = System.IO.Path.GetFileNameWithoutExtension(resolvedFileName);
file.Item["Name"] = System.IO.Path.GetFileNameWithoutExtension(resolvedFileName);
file.SaveBinary(conduitFile);
file.Update();
[EDIT] - Voici ma solution de travail.
SPFile file = item.File;
string resolvedFileName = item.ID.ToString() + "-" + conduitFileName;
item["Title"] = resolvedFileName;
file.SaveBinary(conduitFile);
file.MoveTo(item.ParentList.RootFolder.Url + "/" + resolvedFileName, true);
file.Item["Name"] = resolvedFileName;
file.Update();
La solution
Une fois le fichier enregistré dans la bibliothèque, utilisez la méthode MoveTo
et transmettez le nom de fichier modifié dans le paramètre newUrl
.
Méthode SPFile.MoveTo (chaîne)
Rapide et facile: renommer le fichier téléchargé à l'aide du modèle d'objet SharePoint via un récepteur d'événements
Autres conseils
Une autre manière plus simple que d'utiliser MoveTo consiste à utiliser la propriété BaseName de SPListItem.Vous définiriez ceci en exécutant
item["BaseName"] = resolvedFileName; //Whatever you want the new file name to be
item.Update();
C'est plus facile que MoveTo car vous n'avez pas à vous soucier de la hiérarchie des dossiers et vous n'avez pas à vous soucier de l'extension du fichier.
Pour une raison quelconque, la propriété n'est pas répertoriée dans la documentation MSDN, mais il semble bien fonctionner sans problème.