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é :

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
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".

Ç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 :

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
Mais à ce niveau là j'obtient une erreur du site SharePoint qui déclare "Le serveur distant a retourné une erreur: (401) Non autorisé."

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 :

Nom : Erreurs.PNG
Affichages : 516
Taille : 44,9 Ko

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
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 ... !).

J’espère avoir été aussi clair que possible.

Merci d'avance à tous,

Vincent.