| | |
| | | } |
| | | } |
| | | |
| | | [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(); |
| | | } |
| | | } |