MVC:如何从文件输入字段中获取完整的文件路径? [复制]

Posted

技术标签:

【中文标题】MVC:如何从文件输入字段中获取完整的文件路径? [复制]【英文标题】:MVC: How to get full file path from file input field? [duplicate] 【发布时间】:2017-03-26 02:15:36 【问题描述】:

我有以下剃须刀代码:

  <div class="container">
        @html.ValidationSummary(false)
        @using (Html.BeginForm("EncryptFile", "Encryption", new  returnUrl = Request.Url.AbsoluteUri , FormMethod.Post, new  @id = "encryptionform", @class = "form-horizontal" ))
        

            <div class="form-group">
                @Html.Label("File", new  @class = "control-label col-md-2" )
                <div class="col-md-10">
                    <input type="file" id="encryptfilefield" name="uploadedfile" enctype='multipart/form-data'/>
                </div>
            </div>


                    <button type="submit" id="encryptfilebutton">Encrypt</button>
                    <button id="decryptfilebutton" type="button">Decrypt</button>
                    <button id="reencryptfilebutton" type="button">Re-Encrypt</button>

        
    </div>

当我单击“加密”按钮时,会调用以下控制器代码:

  [HttpPost]
    public ActionResult EncryptFile(string uploadedfile)
    
       /*process the file without uploading*/
      return Json(new  status = "success", message = "Encrypted!" );
    

当我单击加密按钮时,我可以执行此操作,但uploadedfile 字符串始终以null 出现。如何获取所选文件的填充文件路径?请注意,我并没有尝试将其上传到服务器(尽管名称中出现了“已上传”),我只需要文件路径。

编辑

我在 IE 11 中看到以下内容完全显示了文件路径(警报内的部分):

alert($("#encryptfilefield").val());

然而,这不是一个完整的解决方案,而且由于它是一个安全问题,似乎没有解决方案。 谢谢。

【问题讨论】:

我删除了我的答案,因为我意识到 HttpPostedFileBase 不允许您在许多浏览器上获得完整路径,只有文件名。这是一个谈论它的问题。 ***.com/questions/7976998/… 只有IE提供了获取文件所在路径的能力;忘了它是怎么做的,但我记得读过它是可能的。 @NickG 我明白了,谢谢。幸运的是,我的项目要求是使用 Internet Explorer,但谁知道将来是否会改变(无论是在我这边,还是 IE 的这个特性允许访问文件路径)。 只是好奇,你为什么需要客户端机器的图像位置?你用它做什么? Mozilla 怎么样? 【参考方案1】:

更新答案

不幸的是,没有办法在所有浏览器中一致地获取该信息。这里有多个关于此主题的帖子,结论是浏览器出于安全目的不允许它。

我确实发现在 IE 11 中它们确实包含输入 dom 元素 .value 属性中的路径,但我不知道这是否适用于其他版本,并且它不适用于 chrome。

$('input[type=file]').change(function () 
   console.dir(this.value);
   console.dir(this.files[0])
)

不幸的是,这是您可以期待的最好结果。这是一篇文章,您可以做一些事情来实现一些非常具体的场景。

How to get full path of selected file on change of <input type=‘file’> using javascript, jquery-ajax?

原始答案(如何在“到达服务器后”获取文件路径)

我正在考虑的空参数问题是因为 MVC 绑定在元素名称属性上。

 <input type="file" id="encryptfilefield" name="uploadedfile" enctype='multipart/form-data'/>

并且您的控制器操作被标记为类型字符串,这不是您的输入类型。

你可以把它改成这个,

[HttpPost]
public ActionResult EncryptFile(HttpPostedFileBase uploadedfile)

或尝试直接从 Request 对象中获取文件,如下所示,您必须先将其保存在某处,然后才能获得它的完整路径,但我不相信您会获得它起源的文件路径, 仅在您保存后。

[HttpPost]
public ActionResult EncryptFile(string uploadedfile)


    HttpPostedFileBase myfile = Request.Files[0];

    if (file.ContentLength > 0) 
    
        // extract only the fielname
        var fileName = Path.GetFileName(file.FileName);
        // store the file inside ~/App_Data/uploads folder
        var path = Path.Combine(Server.MapPath("~/App_Data/uploads"),fileName);
       file.SaveAs(path);
     

      /*process the file without uploading*/
      return Json(new  status = "success", message = "Encrypted!" );

【讨论】:

不幸的是,我需要它的来源路径,而不是保存的路径 在它触发控制器动作时,它只是一个包裹在 HttpPostedFileBase 对象中的字节流,除了文件名之外没有其他来源信息。 在表单被提交到控制器之前,是否有一种 javascript 方法来获取字段值? 是的,如果在您选择文件之后,如果值在输入中(可能在 value="[filepath]" 属性中),则在您点击提交之前,在它发布之前,这可能会起作用,什么您可以做的是在单击按钮时先编写一些 javascript 或 jquery preventDefault(),然后获取该输入的 .val() 并将其发布到您的控制器操作中。 我只是测试了一下,IE 会在屏幕上呈现完整的文件路径(可能使用 shadow dom 或其他效果)但不包括实际主 DOM 中的文件路径,因为它在shadow dom上渲染,我不知道你甚至可以在客户端访问完整的文件路径。您可能需要一个强制用户填写的强制文件路径输入框或其他内容。

以上是关于MVC:如何从文件输入字段中获取完整的文件路径? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 JavaScript 从完整路径中获取文件名?

如何使用Javascript从文件上传中获取完整路径

如何从文件的完整路径中获取目录?

如何从文件系统中获取已删除文件夹的完整路径

从完整文件路径获取文件夹名称

如何从 URI 获取完整的文件路径