啊鑫
6 天以前 5f467d39b6bcca41c0720493c1f6e68c77ea89e4
StandardInterface/MESApplication/Controllers/QC/LljController.cs
@@ -348,36 +348,87 @@
        }
    }
    [HttpGet("DownloadFtpFile")]
    public IActionResult DownloadFtpFile([FromQuery] string itemNo, [FromQuery] string fileName)
    [HttpGet("PreviewFtpFile")]
    public IActionResult PreviewFtpFile([FromQuery] string itemNo, [FromQuery] string fileName, [FromQuery] string ftpServer)
    {
        // FTP服务器信息
        string ftpServer = "ftp://36.26.21.214";
        string ftpUser = "hm_ftp";
        string ftpPwd = "dell_123";
        string ftpPath = $"{ftpServer}/IQC/{itemNo}/{fileName}";
        try
        {
            var request = (System.Net.FtpWebRequest)System.Net.WebRequest.Create(ftpPath);
            request.Method = System.Net.WebRequestMethods.Ftp.DownloadFile;
            request.Credentials = new System.Net.NetworkCredential(ftpUser, ftpPwd);
            request.UseBinary = true;
            request.UsePassive = false;
            using (var response = (System.Net.FtpWebResponse)request.GetResponse())
            using (var ftpStream = response.GetResponseStream())
            using (var ms = new System.IO.MemoryStream())
            // 添加CORS响应头
            Response.Headers.Add("Access-Control-Allow-Origin", "*");
            Response.Headers.Add("Access-Control-Allow-Methods", "GET, OPTIONS");
            Response.Headers.Add("Access-Control-Allow-Headers", "Content-Type");
            Response.Headers.Add("Access-Control-Expose-Headers", "Content-Type, Content-Length");
            var service = new LljService();
            var fileBytes = service.GetFtpFile(itemNo, fileName, ftpServer);
            if (fileBytes == null || fileBytes.Length == 0)
            {
                ftpStream.CopyTo(ms);
                ms.Position = 0;
                string contentType = "application/octet-stream";
                // 防御性处理,去除fileName中的回车换行和空格
                fileName = fileName?.Trim().Replace("\r", "").Replace("\n", "");
                return File(ms.ToArray(), contentType, fileName);
                return NotFound("文件在FTP服务器上不存在");
            }
            var contentType = service.GetContentType(fileName);
            fileName = fileName?.Trim().Replace("\r", "").Replace("\n", "");
            return File(fileBytes, contentType);
        }
        catch (Exception ex)
        {
            return BadRequest($"FTP下载失败:{ex.Message},ftpPath={ftpPath},fileName={fileName}");
            return StatusCode(500, $"预览文件失败:{ex.Message}");
        }
    }
    [HttpGet("DownloadFtpFile")]
    public IActionResult DownloadFtpFile([FromQuery] string itemNo, [FromQuery] string fileName, [FromQuery] string ftpServer)
    {
        try
        {
            // 添加CORS响应头 - 关键配置用于解决跨域问题
            Response.Headers.Add("Access-Control-Allow-Origin", "*");
            Response.Headers.Add("Access-Control-Allow-Methods", "GET, OPTIONS");
            Response.Headers.Add("Access-Control-Allow-Headers", "Content-Type, Authorization");
            Response.Headers.Add("Access-Control-Expose-Headers", "Content-Disposition, Content-Length, Content-Type");
            var service = new LljService();
            var fileBytes = service.GetFtpFile(itemNo, fileName, ftpServer);
            if (fileBytes == null || fileBytes.Length == 0)
            {
                return NotFound("文件在FTP服务器上不存在");
            }
            var contentType = service.GetContentType(fileName);
            fileName = fileName?.Trim().Replace("\r", "").Replace("\n", "");
            // 设置正确的Content-Disposition响应头以支持文件下载
            var result = File(fileBytes, "application/octet-stream", fileName);
            // 确保Content-Disposition头正确设置,支持中文文件名
            if (!string.IsNullOrEmpty(fileName))
            {
                var encodedFileName = System.Web.HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8);
                Response.Headers.Add("Content-Disposition", $"attachment; filename*=UTF-8''{encodedFileName}");
            }
            return result;
        }
        catch (Exception ex)
        {
            return StatusCode(500, $"下载文件失败:{ex.Message}");
        }
    }
    [HttpOptions("PreviewFtpFile")]
    [HttpOptions("DownloadFtpFile")]
    public IActionResult HandleOptions()
    {
        // 处理CORS预检请求
        Response.Headers.Add("Access-Control-Allow-Origin", "*");
        Response.Headers.Add("Access-Control-Allow-Methods", "GET, OPTIONS");
        Response.Headers.Add("Access-Control-Allow-Headers", "Content-Type, Authorization");
        Response.Headers.Add("Access-Control-Expose-Headers", "Content-Disposition, Content-Length, Content-Type");
        Response.Headers.Add("Access-Control-Max-Age", "86400");
        return Ok();
    }
}