Problem z dekompresja archiwów

0

witam,

mam maly problem. staram sie teraz zeby jesli plik zawiera rozszerzenie zip zostaly rozakowany do c:\temp. w chwili obecnej program rozpkowuje archiwa, ale tyllko i wylacznie jesli znajduja sie we wskazanym miejscu, tzn jesli napisze w programie ze plik jest na oZip.Load("c:\FindingFileTypes.zip"); wtedy program go rozpakuje. jesli natomiast wskarze jego miejsce poprzez formularz, nic sie nie dzieje. bardzo bym prosil o pomoc. zaznacze jeszcze ze jestem poczatkujacm programista.

z gory dziekuje

Default.aspx

<%@ Page Language="C#" AutoEventWireup="true"  CodeFile="Default.aspx.cs" Inherits="_Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head id="Head1" runat="server">
 <title>File Upload</title>
</head>
 <body>
   <form id="Form1" method="post" runat="server">`
     <table cellpadding="0" cellspacing="0" width="80%" align="center" border="4">
      <tr><td height="20px"></td></tr>
      <asp:CheckBox ID="HTML" runat="server" Text="HTML"/><br>
         <asp:CheckBox ID="Java" runat="server" Text="Java"/><br>
         <asp:CheckBox ID="TXT" runat="server" Text="TXT"/>
      
       <tr><td height="80%px" align="left" valign="middle">
       <asp:FileUpLoad id="MyFile" runat="server" size="80"/>
        <br /><br />
          <asp:Label id="lbl"   runat="server" Width="400px" Height="33px" /><br>
          <asp:Button id="UploadBtn" Text="Upload File" OnClick="btnSubmit_Click" runat="server" Width="300px" />  
          <asp:RegularExpressionValidator id="FileUpLoadValidator" runat="server" ErrorMessage="Upload ZIP, HTML, JAVA or TXT files only!" ValidationExpression="(.*\.([zZ][iI][pP]|[hH][tT][mM][lL]|[jJ][aA][vV][aA]|[tT][xX][tT])$)" ControlToValidate="MyFile" />
        </td></tr></table>
      </form>         
</body>
</html>

Default.aspx.cs

using System;
using System.Collections;
using System.ComponentModel;
using System.Configuration;
using System.Data;
using System.Drawing;
using System.IO;
using System.Web;
using System.Web.Security;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using EACompression; 

public partial class _Default : System.Web.UI.Page
{
    protected void btnSubmit_Click(object sender, EventArgs e)
    {
        string fileExt = Path.GetExtension(MyFile.FileName).ToLower();
        string fileName = Path.GetFileName(MyFile.FileName);

        if (MyFile.PostedFile.ContentLength == 0)
        {
            lbl.Text = "Nothing to uppload";
            return;
        }
        else if (fileExt == ".zip")
        {
            try
            {
                ZipArchive oZip = new ZipArchive("TryIt");
                oZip.Load("c:\\FindingFileTypes.zip");

                ZipFile[] zs = oZip.Files;
                int count = zs.Length;
                string password = "";
                bool overwrite = true;
                for (int i = 0; i < count; i++)
                {
                    ZipFile z = zs[i];
                    if (!z.IsDirectory)
                        System.IO.Directory.CreateDirectory(@"c:\temp");
                        oZip.ExtractTo(z, password, "c:\\temp", overwrite);
                }
            }
            catch (Exception ep)
            {
                Console.Write(ep.Message);
            }
            lbl.Text = "Successfully Unzziped: " + MyFile.PostedFile.FileName;				
            //MyFile.PostedFile.SaveAs("c:\\temp\\" + MyFile.PostedFile.FileName);
        }
        else
        {
            System.IO.Directory.CreateDirectory(@"c:\temp");
            lbl.Text = "Successfully Uploaded: " + MyFile.PostedFile.FileName;
            MyFile.PostedFile.SaveAs("c:\\temp\\" + MyFile.PostedFile.FileName);
        }
    }
}

0

Nie korzystałem nigdy z ASP, ale wiem, że jest różnica między nazwą pliku MyFile.FileName, a jego położeniem, poszukaj właściwości o nazwie TmpLocation, albo czegoś podobnego, znam ten problem z PHP, musisz mieć pełen adres do pliku tymczasowego, a nie nazwę orginalnego pliku.

Czyli bład znajduje się w tej linijce:

string fileName = Path.GetFileName(MyFile.FileName);

0

Przejrzałem dokumentację i widzę, że nie ma w tej klasie odpowiedniej właściwości, a więc rozwiązania są 2:

1.zapisać archiwum, a dopiero potem przetworzyć:

...
MyFile.PostedFile.SaveAs("c:\\temp\\" + MyFile.PostedFile.FileName);
ZipArchive oZip = new ZipArchive("TryIt");
oZip.Load("c:\\temp\\" + MyFile.PostedFile.FileName);
...

2.Nie jestem pewien, ale klasa ZipArchive powinna mieć przeciążoną wersję funkcji Load(Stream s);
Wystorczy więc wpisać wtedy:

...
ZipArchive oZip = new ZipArchive("TryIt");
oZip.Load(MyFile.PostedFile.InputStream);
...
0

dzieki za pomoc. zapisalem plik w temp, potem go rozpakowalem, usunalem i wszystko dziala w operze... jesli natomiast uruchamiam kod pod IE, wyrzuca mi blad przy tej linijce:

MyFile.PostedFile.SaveAs("c:\\temp\\"+MyFile.PostedFile.FileName);

jesli natomist zapisze ja w ten sposob:

MyFile.PostedFile.SaveAs("c:\\temp\\MyFile.PostedFile.FileName");

program ja egzekwuje i zapisuje plik pod nazwa "MyFile.PostedFile.FileName" [!!!] jak to zrobic zeby i w IE zapisywal go pod poprawna nazwa [???]

0

2 sprawy:

  1. Sprawdź co zawiera zmienna MyFile.PostedFile.FileName i upewnij się, czy nie zawiera czasem dodatkowego ukośnika na początku, lub czegokolwiek, co przeszkodziłoby w zbudowaniu ścieżki

2.To co napisałem to był tylko przykład, w swoim programie używaj jakiegoś generatora nazw dla plików tymczasowych, wyobraź sobie co będzie gdy użytkownik wyśle plik dane.zip, a ty już taki plik masz na dysku w katalogu temp, lub co gorsza 2 użytkowników jednocześnie wyśle pliki o tej samej nazwie. Zawsze pamiętaj, aby nigdy nie ufać danym przesyłanym przez użytkowników. Ten kod jest zwyczajnie luką w zabezpieczeniach.

1 użytkowników online, w tym zalogowanych: 0, gości: 1