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%" > <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%"> </TD>
<TD width="85%"> </TD>
</TR>
<TR>
<TD width="15%"> Fichier</TD>
<TD width="85%">
<INPUT id="txtUpload" type="file" name="txtUpload" runat="server">
</TD>
</TR>
<TR>
<TD width="15%"> </TD>
<TD width="85%"> </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
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.