我在我的MVC3项目中使用uploadify
。它可以正常上传多个文件并保存到文件夹。
如何将上传文件的路径传递给控制器操作? - 我需要将其传递给我的控制器的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);
}
}
}
答案 0 :(得分:0)
上传时,您无需传递zip文件路径。文件路径是来自客户端机器吗?您的服务器上的应用程序不了解或访问客户端文件系统。
好消息是你不需要它。您已将文件的内容保存在内存中。我从未使用过donetzip,但是一些快速的谷歌搜索显示你可以直接从流中读取拉链。
查看以下链接:
Cannot read zip file from HttpInputStream using DotNetZip 1.9
Extracting zip from stream with DotNetZip
因此,使用这些帖子作为基础来实现...看起来您应该能够像这样更改代码:
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))
{
....
如果有帮助,请告诉我。
答案 1 :(得分:0)
首先,由于安全原因,您无法直接访问客户端计算机。当用户上传一些文件时,Web浏览器会生成一个或两个(通常为1,根据RFC)流和服务器端脚本读取该流,因此不要浪费时间直接从用户的本地计算机的文件路径获取文件。
要提取档案(s.a:Zip,Rar)我强烈建议您使用SevenZipSharp。使用Streams以及许多压缩格式,它的工作非常好用。
作为文档,您可以像这样提取流:
using (MemoryStream msin = new MemoryStream(fileData.InputStream))
{ ... }