c# - ASP.NET CORE 文件上传问题

标签 c# asp.net asp.net-mvc google-chrome internet-explorer

我有一个适用于 Chrome 的文件上传代码,但对于 IE 会抛出以下错误。

"IOException: The process cannot access the file 'path\filename' because it is being used by another process. System.IO.__Error.WinIOError(int errorCode, string maybeFullPath) System.IO.FileStream.Init(string path, FileMode mode, FileAccess access, int rights, bool useRights, FileShare share, int bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs, string msgPath, bool bFromProxy, bool useLongPath, bool checkHost) System.IO.FileStream..ctor(string path, FileMode mode, FileAccess access, FileShare share) System.IO.File.OpenWrite(string path) RES.Controllers.DataHandling.DataUploadController+d__5.MoveNext() in DataUploadController.cs +

Controller 操作方法如下:

public async Task<IActionResult> Upload(UploadedData data)
        {
   var filename=string.Empty;
      if (ModelState.IsValid)
                {
                    var file = data.File;

                    var parsedContentDisposition =
                        ContentDispositionHeaderValue.Parse(file.ContentDisposition);
                     filename = Path.Combine(_hostingEnvironment.ContentRootPath,
                        "UplaodedFiles", parsedContentDisposition.FileName.Trim('"'));


                    using (var stream = System.IO.File.OpenWrite(filename))
                    {
                        await file.CopyToAsync(stream);

                    }
    }
}

查看下面的模型:

 public class UploadedData
    {

        public IFormFile File { get; set; }
    }

我可以想象代码没有任何问题,因为它适用于 Chrome。有谁知道 IE 的问题是什么吗?

最佳答案

这是由于 Internet Explorer 和 Chrome 之间的行为不同造成的。 出于安全原因,Chrome 隐藏了用户目录的路径。
这意味着您只能获取变量中的文件名(例如 myfile.txt)。

而 Internet Explorer 会为您提供上传文件的完整客户端路径 (C:\Users\User1\myfile.txt)。

Path.Combine 然后失败并返回客户端路径(例如 C:\Users\User1\myfile.txt),而不是上传目录的组合路径。

您的服务器无法打开该文件,因为在您的测试/开发环境中该文件是由您的浏览器打开的。

filename = Path.Combine(@"D:\",
               "UploadedFiles", Path.GetFileName(parsedContentDisposition.FileName.Trim('"')));

parsedContentDisposition.FileName 周围使用 Path.GetFileName(..) 可以解决该问题。

简而言之:

IE 中的

Path.Combine 尝试合并 D:\UploadedFilesC:\Users\User1\myfile。 txt 导致 C:\Users\User1\myfile.txt 并失败。

Chrome 中的

Path.Combine 尝试合并 D:\UploadedFilesmyfile.txt,结果在 D:\UploadedFiles\myfile.txt 中并成功。

我认为这种行为是由于 Chrome 和 Firefox 中的这种安全机制造成的,在 this question on Stack Overflow 上进行了讨论。 .

编辑: Internet Explorer 仅上传本地 Intranet 区域内标准设置的完整路径。

关于c# - ASP.NET CORE 文件上传问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44718080/

相关文章:

c# - 如何通过代码测试某些条件然后验证或无效并显示错误消息?

c# - Emgu.CV 4.2.0 图像转换方法不可用

asp.net - 适用于 ASP.NET 和 MVC3 的自定义身份验证提供程序

asp.net-mvc - 在 ASP.NET MVC 3 的类库中使用 MEF

c# - 无法获取带参数的路由

c# - 我怎样才能使用 linerenderer 绘制一个圆圈,并使它成为圆圈,因为对象的子对象应该围绕它绘制?

c# - 在返回字符串的方法中使用 do while 语句

c# - 使用数据列表从 asp.net 中的文件夹绑定(bind)视频

asp.net - 是否可以在 ASP.NET 重定向期间设置 cookie?

c# - Azure 应用服务 File.ReadAllText 返回文件未找到异常,但文件存在于该位置