DotNetZip Library: flache Struktur + Mac Filter
Um Benutzern zu ermöglichen, mehrere Files auf einmal auf den Webserver zu übertragen, gibt es zwei Möglichkeiten: via client-side Code (Java Applet, Flash etc..) à la Facebook eine Fileauswahl zu entwickeln, oder Zip Files über das normale Upload Control zu übertragen und auf dem Server entsprechen zu behandeln. Da unsere App auch in restriktiven Umgebungen laufen muss, in denen Java Applets und Flash nicht immer gerne gesehen werden, war die Auswahl der geeigneten Methode relativ einfach..
Um die Zips auf dem Server zu verarbeiten, setzen wir die DotNetZip Library ein ( http://www.codeplex.com/DotNetZip ). Hier der Samplecode für eine Methode, die allfällige Ordnerstrukturen im Zip ignoriert und einfach alle Files in einen Folder entpackt. Mit Mac Os X gezippte Files enthalten jeweils einen ganzen Stapel an Resource Fork Files, die für uns nicht relevant sind und deshalb auch gleich gefiltert werden:
Protected Sub Extract()
Dim file As UploadedFile = RadUpload1.UploadedFiles(0)
Dim targetFolder As String = Server.MapPath(RadUpload1.TargetFolder)
Dim targetFileName As String = Path.Combine(targetFolder, file.GetNameWithoutExtension() + file.GetExtension())
Try
Dim zip As ZipFile = ZipFile.Read(targetFileName)
For Each e As ZipEntry In zip
'extract all files in a single folder, ignore existing folder structure
Dim s As String = e.FileName
Dim pathend As Integer = s.LastIndexOf("/") + 1
Dim filename As String = s.Substring(pathend)
e.FileName = filename
'filter mac resource files
If Not (e.FileName.StartsWith("._")) Then
e.Extract(targetFolder, True)
counterFiles = counterFiles + 1
End If
Next
zip.Dispose()
Catch ex As Exception
Response.Write(ex.ToString)
End Try
End Sub