Bonjour à tous,
Voici donc mon soucis : J'ai développé pour mon entreprise un petit logiciel qui sert au service qualité. Le principe est que les opérateurs du contrôle qualité prennent des photos lorsqu'ils tombent sur un problème pour ensuite l'envoyer à nos différents fournisseurs. Le logiciel lit le code barre présent sur les photos des articles, en tire la référence, renomme, recadre et compresse l'image afin de l'envoyer sur un serveur SharePoint.
Mon problème intervient au niveau de l'envoi sur le serveur SharePoint : actuellement pour envoyer les photos j'ai fait en sorte qu'un lecteur réseau soit créé sur l'ordinateur de l'opérateur, puis je fais un CopyFile depuis le dossier local sur le SharePoint via le lecteur réseau. Cette procédure prend énormément de temps (bien que ce soit des photos de l'ordre de 100 à 200Ko) car à chaque fichier copié, il doit accéder à nouveau au SharePoint via le lecteur réseau.
En revanche un accès direct sur le site pour envoyer les photos manuellement prend moins de temps (à l'envoi) mais est extrêmement plus contraignant puisque les fichiers ne peuvent être envoyés qu'un par un.
Pour mieux comprendre la routine, voici le code utilisé :
Je développe via Microsoft Visual Basic 2010 Express, sur un poste qui utilise Windows 7 Entreprise en 64 bits. Le SharePoint quant à lui est en version 2007, je n'ai aucun contrôle direct sur le serveur. Par ailleurs, dans les paramètres du site SharePoint que je dois utiliser, il est spécifié "Version : 12.0.0.6557".
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36 Sub SendNClose() Dim di As New System.IO.DirectoryInfo("S:") If Not di.Exists() Then MapDriveLetter.MapDrive("S", "\\LadresseDuSharePoint\") End If Dim Mois As String = Format(Now(), "MMMM") Dim An As String = Format(Now(), "yyyy") Dim Counter = My.Computer.FileSystem.GetFiles(PPM.LinkLabel.Text, Microsoft.VisualBasic.FileIO.SearchOption.SearchTopLevelOnly, "*.jpg") PPM.ProgressBar.Minimum = 0 PPM.ProgressBar.Maximum = 100 Dim I As Integer = 0 For Each foundFile As String In My.Computer.FileSystem.GetFiles( PPM.LinkLabel.Text, Microsoft.VisualBasic.FileIO.SearchOption.SearchTopLevelOnly, "*.jpg") Dim OnlyFileName As String = System.IO.Path.GetFileName(foundFile) Dim PathToSharePoint As String = "S:\" & An & "\" & Mois & "\" & OnlyFileName On Error Resume Next My.Computer.FileSystem.CopyFile(foundFile, PathToSharePoint) I = I + 1 Dim Percent As Integer = CInt(Math.Truncate(I / CStr(Counter.Count) * 100)) PPM.ProgressBar.Value = Percent Next MsgBox("Téléchargement des fichiers sur le serveur terminé.", vbOKOnly, "Envoi terminé") End Sub
Ça fait deux semaines que je cherche un moyen d'envoyer les photos sans passer par un lecteur réseau, j'ai trouvé un nombre conséquent d'exemples mais qui ne répondent pas à ma problématique, car dans 80% des solutions trouvées, il faut passer par la librairie Microsoft.SharePoint.dll qui se trouve côté serveur, or je suis côté client.
La solution proposée par Microsoft (suivre ce lien) propose justement cette solution et je n'ai pas réussi le retranscrire en client (Microsoft.SharePoint.Client + Microsoft.SharePoint.Client.Runtime).
J'ai tenté une autre solution (disponible à cette adresse) en l'adaptant selon mes possibilités et en virant la partie metadata :
Mais à ce niveau là j'obtient une erreur du site SharePoint qui déclare "Le serveur distant a retourné une erreur: (401) Non autorisé."
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36 Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click MessageBox.Show(UploadDocument("D:\Koala.jpg", "Koala.jpg")) End Sub Public Function UploadDocument(ByVal localFile As String, _ ByVal remoteFile As String) As String '// Read in the local file On Error GoTo handler Dim r As Byte() Dim Strm As System.IO.FileStream = New System.IO.FileStream(localFile, _ System.IO.FileMode.Open, System.IO.FileAccess.Read) Dim reader As System.IO.BinaryReader = New System.IO.BinaryReader(Strm) Dim filecontents As Byte() = reader.ReadBytes(CInt(Strm.Length)) reader.Close() Strm.Close() Dim sSPURL As String = "https://ladressedusharepoint/sites/ppm_rmc/PPM%20RMC" Dim sUser As String = "*****" Dim sPwd As String = "*****" Dim sDomain As String = "https://ladressedusharepoint" Dim sRemoteFileURL As String Dim NC As System.Net.NetworkCredential = _ New System.Net.NetworkCredential(sUser, sPwd, sDomain) sRemoteFileURL = sSPURL & "/" & Trim(LTrim(RTrim(remoteFile))) sRemoteFileURL = Replace(sRemoteFileURL, " ", "%20") sRemoteFileURL = Replace(sRemoteFileURL, "\", "/") Dim m_WC As WebClient = New WebClient m_WC.Credentials = NC r = m_WC.UploadData(sRemoteFileURL, "PUT", filecontents) Return "TRUE" Exit Function handler: Return Err.Description End Function
Dans le même genre j'ai essayé cette solution, en prenant soin d'ajouter les références Microsoft.SharePoint.Client + Microsoft.SharePoint.Client.Runtime, mais au moment de lancer le programme, Visual Studio me sort trois avertissements qui génèrent eux-même des erreurs, alors que lors de la programmation tout va bien :
Je commence vraiment à sécher sur les solutions possibles pour faire en sorte que l'upload des images soit plus rapide sans passer obligatoirement par une page d'application pour SharePoint ou un service web se servant d'ASP.NET (d'autant que je ne sais pas du tout si cela pourrait fonctionner ... !).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click MessageBox.Show(UploadDocument("TestFile1.txt", "D:\\TestUpload1.txt", metaData)) End Sub Public Function UploadDocument(fileName As String, filePath As String, metaDataDictionary As Dictionary(Of String, String)) As Boolean Dim ctx As New ClientContext("https://ladressedusharepoint/sites/ppm_rmc/") Dim currentWeb As Web = ctx.Web Dim fileToUpload As FileCreationInformation = New FileCreationInformation fileToUpload.Content = System.IO.File.ReadAllBytes(filePath) fileToUpload.Url = "https://ladressedusharepoint/sites/ppm_rmc/PPM%20RMC/" + fileName Dim docLib As Microsoft.SharePoint.Client.List = currentWeb.Lists.GetByTitle("PPM RMC") Dim uploadedFile As Microsoft.SharePoint.Client.File = docLib.RootFolder.Files.Add(fileToUpload) ctx.Load(uploadedFile) ctx.ExecuteQuery() Return True End Function
J’espère avoir été aussi clair que possible.
Merci d'avance à tous,
Vincent.
Partager