Chaines de caractères - upload

Contenu du snippet

Ce code peut servir de complément au projet de fabrice69 "FabManager" pour y intéger l'upload. De nombreux exemples sur l'upload de fichier existent mais très peu pensent à préciser le besoin fréquent de manipuler le nom des fichiers uploadés par un utilisateur.

Dans mon cas mes utilisateurs n'hésitent pas à uploader des fichiers dont le nom ressemble plus à une phrase qu'un nom de fichier, lorsque l'on tombe pas dans le délire du roman en guise de nom de fichier, sisi çà existe !

Voici donc quelques classes concernant l'épuration de certains caractères et le remplacement des caractère à accents, ces derniers posent souvent problèmes lors du téléchargement, cf FabManager http://www.aspfr.com/code.aspx?ID=23262)

Source / Exemple :


'Fichier ManipFile.vb
'-------------------------------------------------------------------------------------------------------------------------------------

Imports System
Imports System.IO
Imports System.Text
Imports System.Text.RegularExpressions

Public Class ManipFile

    '--------------------------------------------------------------------------------------------
    ' Nettoyage des chaines de caractères
    '--------------------------------------------------------------------------------------------

    ' Vire les accents
    Public Shared Function noaccent(ByVal txt)

        Dim strTemp As String = txt

        ' création des objet Regex
        Dim regE As New Regex("(é|è|ê|ë)")
        Dim regA As New Regex("(à|â|ä)")
        Dim regC As New Regex("(ç)")
        Dim regU As New Regex("(ù)")

        'Remplace les caractères indésirables par leur équivalent
        strTemp = regE.Replace(strTemp, "e", 1)
        strTemp = regA.Replace(strTemp, "a", 1)
        strTemp = regC.Replace(strTemp, "c", 1)
        strTemp = regU.Replace(strTemp, "u", 1)

        noaccent = strTemp

    End Function

    'Vire tous les caractères indésirables,
    'et remplace les accents par leur équivalent sans accent
    Public Shared Function nochar(ByVal strTxt As String) As String

        ' Moi ces caractères j'en veux pas dans le nom d'un fichier, à vous de faire le trie
        Dim ListDelChar As String = " ²&~#'{([-|`\^@)]°+=}<>,?;/:!§%*µ$£€"
        Dim DelChar As String
        Dim i As Integer

        For i = 1 To Len(ListDelChar)
            DelChar = ListDelChar.Chars(i - 1)
            strTxt = Replace(strTxt, DelChar, String.Empty)
        Next

        nochar = noaccent(strTxt)
        Return nochar

    End Function

'Permet d'avoir uniquement le nom du fichier à partir de son path
    Shared Function IsoleFile(ByVal path As String) As String

        Dim sSplit() As String
        sSplit = Split(path, "\")
        path = sSplit(UBound(sSplit))

        IsoleFile = path

    End Function

' Vire les \ et les renplace par des /
    'Pour passer d'un path à une url par exemple 
    Public Shared Function noantislash(ByVal txt)

        Dim strTemp As String = txt

        'Remplace le caractères indésirable
        strTemp = Replace(strTemp, "\", "/")
       
        noantislash = strTemp

    End Function

    'Upload
    Shared Function Upload( ByVal sFile As String, ByVal sFullPath As String, ByVal txtUpload As System.Web.UI.HtmlControls.HtmlInputFile) As String

        Try
            'Ecriture sur server, nécessite droits ntfs sur compte asp.net
            txtUpload.PostedFile.SaveAs(sFullPath)
            'Infos comme quoi çà c'est bien passé
            Upload = "Ok"
        Catch Ex As Exception
            Upload = "Envoie du fichier " & sFile & " vers le serveur n'a pas réussi pour la raison suivante : " & Ex.Message
        Finally

        End Try

    End Function

End Class

'-------------------------------------------------------------------------------------------------------------------------------------

'Fichier upload.aspx
'-------------------------------------------------------------------------------------------------------------------------------------
<%@ Page Language="vb" AutoEventWireup="false" Codebehind="upload.aspx.vb" Inherits="votreappli.upload"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
	<title>Votre application</title>
</HEAD>
<body>
<form id="Form1" method="post" enctype="multipart/form-data" runat="server">

<TABLE class="ridge" cellSpacing="0" width="100%">
	<TR>
	               <TD width="30%" >&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <STRONG>
                                       <FONT color="#ffffcc" size="2">Importation de Fichier</FONT></STRONG>
	               </TD>
	               <TD align="left" width="70%" colSpan="2" rowSpan="1"></TD>
	</TR>
	<TR>
		<TD width="15%">&nbsp;</TD>
		<TD width="85%">&nbsp;</TD>
	</TR>
	<TR>
		<TD width="15%">&nbsp;&nbsp;&nbsp;&nbsp; Fichier</TD>
		<TD width="85%">
		<INPUT id="txtUpload" type="file" name="txtUpload" runat="server">&nbsp;&nbsp;
		</TD>
	</TR>
	<TR>
		<TD width="15%">&nbsp;</TD>
		<TD width="85%">&nbsp;</TD>
	</TR>
</TABLE>
<br>
<asp:ImageButton id="BtnUpload" runat="server" ImageUrl="../img/GValider.gif" ToolTip="Enregistrer"></asp:ImageButton>
</form>
</body>
</HTML>

'Fichier upload.aspx.vb
'-------------------------------------------------------------------------------------------------------------------------------------

Imports System.Web

Public Class upload
    Inherits System.Web.UI.Page

Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

End Sub

'Valide l'Upload
Private Sub BtnUpload_Click(ByVal sender As System.Object, ByVal e As System.Web.UI.ImageClickEventArgs) Handles BtnUpload.Click

        If txtUpload.PostedFile.FileName <> String.Empty Then

            'Instanciation de la class
            Dim manip As New ManipFile

            'Initialisation des variables
            Dim sFullDir As String = "E:\VotreREP\VotreSSRep
            Dim sFile As String = manip.nochar(manip.IsoleFile(txtUpload.PostedFile.FileName))
            Dim sFullPATH As String = sFullDir & "\" & sFile
            
            'Upload
            manip.Upload(sFile, sFullPATH, txtUpload)

            'Réinitialisation des textbox
            sFullPATH = String.Empty
            sFullURL = String.Empty

         End If

    End Sub

End Class

Conclusion :


Remarque :

Lors d'un nettoyage en masse d'une chaine de caractère et remplacement par 'rien', évitez peut-être d'utiliser à tout va Replace(). C'est quant même plus court d'utiliser une boucle cf. nochar().

De plus de cette manière, vous pourrait enrichir cette fonction d'un paramètre supplémentaire spécifiant la liste de caractères à virer selon les cas, stockez vos liste dans le web.config par exemple ! Ce qui serait impossible avec les Replace() en masse.

Public Shared Function nochar(ByVal strTxt As String, Byval strList as String) As String

' Moi ces caractères j'en veux pas dans le nom d'un fichier, à vous de faire le trie
Dim ListDelChar As String = strList
Dim DelChar As String
Dim i As Integer

For i = 1 To Len(ListDelChar)
DelChar = ListDelChar.Chars(i - 1)
strTxt = Replace(strTxt, DelChar, String.Empty)
Next

nochar = noaccent(strTxt)
Return nochar

End Function

Ex : nochar("nom du fichier d'origine", ConfigurationSettings.AppSettings("Liste1"))

PS : je n'ai pas eu le temps de tester la source adaptée qui est extraite d'une de mes appli en dev donc svp INDULGENCE ! Merci

Denis

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.