0

私はuploadifyMVC3プロジェクトで使用しています。複数のファイルをアップロードしてフォルダに保存することもできます。

アップロードされたファイルのパスをコントローラーアクションに渡す方法は?ExtractingZip-コントローラーのアクションに渡す必要があります。

.zipファイルの内容を抽出するために、DotNetZipライブラリを使用しています。

これが私がこれまでに試したことです。

$('#file_upload').uploadify({
            'checkExisting': 'Content/uploadify/check-exists.php',
            'swf': '/Content/uploadify/uploadify.swf',
            'uploader': '/Home/Index',
            'auto': false,
            'buttonText': 'Browse',
            'fileTypeExts': '*.jpg;*.jpeg;*.png;*.gif;*.zip',
            'removeCompleted': false,
            'onSelect': function (file) {
                if (file.type == ".zip") {
                    debugger;
                    $.ajax({
                        type: 'POST',
                        dataType: 'json',
                        url: '@Url.Action("ExtractingZip", "Home")',
                        data: ({ fileName: file.name}), // I dont see a file.path to pass it to controller
                        success: function (result) {
                            alert('Success');
                        },
                        error: function (result) {
                            alert('error');
                        }
                    });
                }

            }
});

これが私のコントローラーのアクションです:

   [HttpPost]
            public ActionResult ExtractingZip(string fileName,string filePath, HttpPostedFileBase fileData)
            {

                string zipToUnpack = @"C:\Users\Public\Pictures\Sample Pictures\images.zip";// I'm unable to get the filePath so i'm using the path.
                string unpackDirectory = System.IO.Path.GetTempPath();

                using (ZipFile zip1 = ZipFile.Read(zipToUnpack))
                {
                    // here, we extract every entry, but we could extract conditionally
                    // based on entry name, size, date, checkbox status, etc.  
                    var collections = zip1.SelectEntries("name=*.jpg;*.jpeg;*.png;*.gif;");

                    foreach (var item in collections)
                    {
                        item.Extract(unpackDirectory, ExtractExistingFileAction.OverwriteSilently);
                    }
                }
                return Json(true);
            }

[HttpPost]
        public ActionResult Index(IEnumerable<HttpPostedFileBase> fileData)
        {

                foreach (var file in fileData)
                {
                    if (file.ContentLength > 0)
                    {
                        string currpath;

                        currpath = Path.Combine(Server.MapPath("~/Images/User3"), file.FileName);
                        //save to a physical location
                        file.SaveAs(currpath);
                    }
                }
        }
4

2 に答える 2

0

アップロード時にzipのファイルパスを渡す必要はありません。ファイルパスはクライアントマシンからのものでしょうか?サーバー上のアプリケーションには、クライアントのファイルシステムに関する知識やアクセス権がありません。

良いニュースはあなたがそれを必要としないということです。ファイルの内容はすでにメモリにあります。私はdonetzipを使用したことがありませんが、いくつかの簡単なグーグルで、ストリームから直接zipを読み取ることができることがわかります。

これらのリンクをチェックしてください:

DotNetZip1.9を使用してHttpInputStreamからzipファイルを読み取ることができません

DotNetZipを使用してストリームからzipを抽出する

したがって、これらの投稿をベースとして使用して、次のようにコードを変更できるようになります。

            string zipToUnpack = @"C:\Users\Public\Pictures\Sample Pictures\images.zip";// I'm unable to get the filePath so i'm using the path.
            string unpackDirectory = System.IO.Path.GetTempPath();

            using (ZipFile zip1 = ZipFile.Read(zipToUnpack))
            {
                ....

に変更...

            string unpackDirectory = System.IO.Path.GetTempPath();

            using (ZipFile zip1 = ZipFile.Read(fileData.InputStream))
            {
                ....

それが役に立ったら教えてください。

于 2012-12-17T13:13:51.300 に答える
0

まず、セキュリティ上の理由から、クライアントのマシンに直接アクセスすることはできません。ユーザーがいくつかのファイルをアップロードしている間、Webブラウザーは1つまたは2つ(RFCによると通常1)のストリームを作成し、サーバー側スクリプトがそのストリームを読み取るため、ユーザーのローカルマシンのファイルパスから直接ファイルを取得するために時間を無駄にしないでください。

アーカイブ(sa:Zip、Rar)を抽出するには、SevenZipSharpを使用することを強くお勧めします。これは、Streamsや多くの圧縮形式で非常に簡単に機能します。

それらのドキュメントとして、次のようにストリームを抽出できます。

using (MemoryStream msin = new MemoryStream(fileData.InputStream)) 
{ ... }
于 2012-12-17T13:43:54.447 に答える