0

uploadify在我的 MVC3 项目中使用。上传多个文件并保存到文件夹也可以正常工作。

如何将上传文件的路径传递给控制器​​动作?-- 我需要将它传递给ExtractingZip我的控制器的操作。

为了提取.zip文件的内容,我使用了 DotNetZip Library

这是我到目前为止所尝试的。

$('#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。

查看这些链接:

无法使用 DotNetZip 1.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 浏览器会创建一个或两个(根据 RFC 通常为 1 个)流,服务器端脚本会读取该流,因此不要浪费时间直接从用户本地计算机的文件路径获取文件。

要提取档案(sa:Zip,Rar),我强烈建议您使用SevenZipSharp。它与 Streams 以及许多压缩格式一起工作得非常好和容易。

作为他们的文档,您可以像这样提取流:

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