533 lines
		
	
	
		
			21 KiB
		
	
	
	
		
			C#
		
	
	
			
		
		
	
	
			533 lines
		
	
	
		
			21 KiB
		
	
	
	
		
			C#
		
	
	
using System;
 | 
						|
using System.Collections.Generic;
 | 
						|
using System.IO;
 | 
						|
using System.Net;
 | 
						|
using System.Threading.Tasks;
 | 
						|
using IRaCIS.Application.Interfaces;
 | 
						|
using IRaCIS.Application.Contracts;
 | 
						|
using IRaCIS.Core.API.Utility;
 | 
						|
using IRaCIS.Core.Application.Contracts.Image;
 | 
						|
using IRaCIS.Core.Infrastructure.Extention;
 | 
						|
using Microsoft.AspNetCore.Authorization;
 | 
						|
using Microsoft.AspNetCore.Hosting;
 | 
						|
using Microsoft.AspNetCore.Http;
 | 
						|
using Microsoft.AspNetCore.Http.Features;
 | 
						|
using Microsoft.AspNetCore.Mvc;
 | 
						|
using Microsoft.AspNetCore.WebUtilities;
 | 
						|
using Microsoft.Extensions.Configuration;
 | 
						|
using Microsoft.Extensions.Hosting;
 | 
						|
using Microsoft.Extensions.Logging;
 | 
						|
using Microsoft.Net.Http.Headers;
 | 
						|
using IRaCIS.Core.Application.Filter;
 | 
						|
using IRaCIS.Core.Application.Contracts;
 | 
						|
 | 
						|
namespace IRaCIS.Api.Controllers
 | 
						|
{
 | 
						|
    /// <summary>
 | 
						|
    /// 文件上传
 | 
						|
    /// </summary>
 | 
						|
    [Route("file")]
 | 
						|
    [ApiController, Authorize, ApiExplorerSettings(GroupName = "Common")]
 | 
						|
    public class FileController : ControllerBase
 | 
						|
    {
 | 
						|
        private readonly IFileService _fileService;
 | 
						|
        private readonly IWebHostEnvironment _webHostEnvironment;
 | 
						|
        private readonly IHostEnvironment _hostEnvironment;
 | 
						|
        private ILogger<FileController> _logger;
 | 
						|
 | 
						|
        private string _targetFilePath;
 | 
						|
        private readonly long _fileSizeLimit;
 | 
						|
        private readonly string[] _permittedExtensions = { ".pdf", ".doc", ".docx" };
 | 
						|
 | 
						|
        public string trustedFileNameForFileStorage = "";
 | 
						|
 | 
						|
        // Get the default form options so that we can use them to set the default 
 | 
						|
        // limits for request body data.
 | 
						|
        private static readonly FormOptions _defaultFormOptions = new FormOptions();
 | 
						|
        private string defaultUploadFilePath = string.Empty;
 | 
						|
        public FileController(IFileService fileService, Microsoft.Extensions.Configuration.IConfiguration config,
 | 
						|
            IHostEnvironment hostEnvironment, ILogger<FileController> logger,
 | 
						|
            IWebHostEnvironment webHostEnvironment)
 | 
						|
        {
 | 
						|
            _fileService = fileService;
 | 
						|
            _hostEnvironment = hostEnvironment;
 | 
						|
            _webHostEnvironment = webHostEnvironment;
 | 
						|
            _fileSizeLimit = config.GetValue<long>("FileSizeLimit");
 | 
						|
            defaultUploadFilePath = Directory.GetParent(_hostEnvironment.ContentRootPath.TrimEnd('\\')).FullName;
 | 
						|
 | 
						|
            _logger = logger;
 | 
						|
 | 
						|
            _logger.LogWarning("File Path:" + defaultUploadFilePath);
 | 
						|
 | 
						|
        }
 | 
						|
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// 上传文件[FileUpload]
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="attachmentType">附件类型</param>
 | 
						|
        /// <param name="doctorId">医生Id</param>
 | 
						|
        /// <returns>返回文件信息</returns>
 | 
						|
        [HttpPost, Route("uploadFile/{attachmentType}/{doctorId}")]
 | 
						|
        [DisableFormValueModelBinding]
 | 
						|
        public async Task<IActionResult> UploadOrdinaryFile(string attachmentType, Guid doctorId)
 | 
						|
        {
 | 
						|
            #region 官方文档方式 
 | 
						|
 | 
						|
 | 
						|
            if (!MultipartRequestHelper.IsMultipartContentType(Request.ContentType))
 | 
						|
            {
 | 
						|
                ModelState.AddModelError("File",
 | 
						|
                    $"The request couldn't be processed (Error 1).");
 | 
						|
                // Log error
 | 
						|
                return BadRequest(ModelState);
 | 
						|
            }
 | 
						|
 | 
						|
            var boundary = MultipartRequestHelper.GetBoundary(
 | 
						|
                MediaTypeHeaderValue.Parse(Request.ContentType),
 | 
						|
                _defaultFormOptions.MultipartBoundaryLengthLimit);
 | 
						|
            var reader = new MultipartReader(boundary, HttpContext.Request.Body);
 | 
						|
            var section = await reader.ReadNextSectionAsync();
 | 
						|
 | 
						|
            while (section != null)
 | 
						|
            {
 | 
						|
                var hasContentDispositionHeader =
 | 
						|
                    ContentDispositionHeaderValue.TryParse(
 | 
						|
                        section.ContentDisposition, out var contentDisposition);
 | 
						|
 | 
						|
                if (hasContentDispositionHeader)
 | 
						|
                {
 | 
						|
                    // This check assumes that there's a file
 | 
						|
                    // present without form data. If form data
 | 
						|
                    // is present, this method immediately fails
 | 
						|
                    // and returns the model error.
 | 
						|
                    if (!MultipartRequestHelper
 | 
						|
                        .HasFileContentDisposition(contentDisposition))
 | 
						|
                    {
 | 
						|
                        ModelState.AddModelError("File",
 | 
						|
                            $"The request couldn't be processed (Error 2).");
 | 
						|
                        // Log error
 | 
						|
                        return BadRequest(ModelState);
 | 
						|
                    }
 | 
						|
                    else
 | 
						|
                    {
 | 
						|
                        // Don't trust the file name sent by the client. To display
 | 
						|
                        // the file name, HTML-encode the value.
 | 
						|
                        var trustedFileNameForDisplay = WebUtility.HtmlEncode(
 | 
						|
                                contentDisposition.FileName.Value);
 | 
						|
 | 
						|
                        //var trustedFileNameForFileStorage = Path.GetRandomFileName();
 | 
						|
                        trustedFileNameForFileStorage = contentDisposition.FileName.Value;
 | 
						|
 | 
						|
                        // **WARNING!**
 | 
						|
                        // In the following example, the file is saved without
 | 
						|
                        // scanning the file's contents. In most production
 | 
						|
                        // scenarios, an anti-virus/anti-malware scanner API
 | 
						|
                        // is used on the file before making the file available
 | 
						|
                        // for download or for use by other systems. 
 | 
						|
                        // For more information, see the topic that accompanies 
 | 
						|
                        // this sample.
 | 
						|
 | 
						|
                        var streamedFileContent = await FileHelpers.ProcessStreamedFile(
 | 
						|
                            section, contentDisposition, ModelState,
 | 
						|
                            _permittedExtensions, _fileSizeLimit);
 | 
						|
 | 
						|
                        if (!ModelState.IsValid)
 | 
						|
                        {
 | 
						|
                            return BadRequest(ModelState);
 | 
						|
                        }
 | 
						|
 | 
						|
 | 
						|
                        //实际文件处理
 | 
						|
                        string uploadFolderPath = Path.Combine(defaultUploadFilePath, "UploadFile/" + doctorId + "/");
 | 
						|
 | 
						|
                        var doctorAttachmentUploadFolder = Path.Combine(uploadFolderPath, attachmentType);
 | 
						|
 | 
						|
                        _targetFilePath = doctorAttachmentUploadFolder;
 | 
						|
 | 
						|
                        if (!Directory.Exists(doctorAttachmentUploadFolder)) Directory.CreateDirectory(doctorAttachmentUploadFolder);
 | 
						|
 | 
						|
                        using (var targetStream = System.IO.File.Create(
 | 
						|
                            Path.Combine(_targetFilePath, trustedFileNameForFileStorage)))
 | 
						|
                        {
 | 
						|
                            await targetStream.WriteAsync(streamedFileContent);
 | 
						|
 | 
						|
                            var attachmentPath = $"/UploadFile/{doctorId}/{attachmentType}/{trustedFileNameForFileStorage}";
 | 
						|
 | 
						|
                            return new JsonResult(ResponseOutput.Ok(new UploadFileInfoDTO() { FilePath = attachmentPath, FullFilePath =  attachmentPath + "?access_token=" + HttpContext.Request.Headers["Authorization"].ToString().Substring(7) }));
 | 
						|
 | 
						|
                        }
 | 
						|
 | 
						|
 | 
						|
                    }
 | 
						|
                }
 | 
						|
 | 
						|
                // Drain any remaining section body that hasn't been consumed and
 | 
						|
                // read the headers for the next section.
 | 
						|
                section = await reader.ReadNextSectionAsync();
 | 
						|
            }
 | 
						|
 | 
						|
 | 
						|
            return Created(nameof(FileController), null);
 | 
						|
 | 
						|
            #endregion
 | 
						|
        }
 | 
						|
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// 上传文件( 不是医生个人的文件)[FileUpload]
 | 
						|
        /// 例如:阅片章程等
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="type">文件类型</param>
 | 
						|
        /// <returns></returns>
 | 
						|
 | 
						|
        [HttpPost, Route("uploadNonDoctorFile/{type}")]
 | 
						|
        [DisableFormValueModelBinding]
 | 
						|
        public async Task<IActionResult> UploadNonDoctorFile(string type)
 | 
						|
        {
 | 
						|
            #region New Test  实测OK
 | 
						|
 | 
						|
            //上传根路径
 | 
						|
            string uploadFolderPath = Path.Combine(defaultUploadFilePath, "UploadFile");
 | 
						|
 | 
						|
 | 
						|
            if (uploadFolderPath != null)
 | 
						|
            {
 | 
						|
                //文件类型路径处理
 | 
						|
                var uploadTypePath = Path.Combine(uploadFolderPath, type);
 | 
						|
                if (!Directory.Exists(uploadTypePath)) Directory.CreateDirectory(uploadTypePath);
 | 
						|
 | 
						|
 | 
						|
                ////实际文件处理
 | 
						|
 | 
						|
                _targetFilePath = uploadTypePath;
 | 
						|
 | 
						|
                //获取boundary
 | 
						|
 | 
						|
                #region 方式二
 | 
						|
 | 
						|
                var boundary = MultipartRequestHelper.GetBoundary(
 | 
						|
                    MediaTypeHeaderValue.Parse(Request.ContentType),
 | 
						|
                    _defaultFormOptions.MultipartBoundaryLengthLimit);
 | 
						|
 | 
						|
                #endregion
 | 
						|
 | 
						|
                #region 方式一
 | 
						|
                //var boundary = HeaderUtilities.RemoveQuotes(MediaTypeHeaderValue.Parse(Request.ContentType).Boundary).Value;
 | 
						|
 | 
						|
                #endregion
 | 
						|
 | 
						|
 | 
						|
                //得到reader
 | 
						|
                var reader = new MultipartReader(boundary, HttpContext.Request.Body);
 | 
						|
                //{ BodyLengthLimit = 2000 };//
 | 
						|
                var section = await reader.ReadNextSectionAsync();
 | 
						|
 | 
						|
                //读取section
 | 
						|
                while (section != null)
 | 
						|
                {
 | 
						|
                    var hasContentDispositionHeader = ContentDispositionHeaderValue.TryParse(section.ContentDisposition, out var contentDisposition);
 | 
						|
                    if (hasContentDispositionHeader)
 | 
						|
                    {
 | 
						|
                        trustedFileNameForFileStorage = contentDisposition.FileName.Value;
 | 
						|
 | 
						|
 | 
						|
                        await WriteFileAsync(section.Body, Path.Combine(_targetFilePath, trustedFileNameForFileStorage));
 | 
						|
 | 
						|
                        #region 方式二
 | 
						|
 | 
						|
                        //using (var targetStream = System.IO.File.Create(
 | 
						|
                        //    Path.Combine(_targetFilePath, trustedFileNameForFileStorage)))
 | 
						|
                        //{
 | 
						|
 | 
						|
                        //    using (var memoryStream = new MemoryStream())
 | 
						|
                        //    {
 | 
						|
                        //        await section.Body.CopyToAsync(memoryStream);
 | 
						|
 | 
						|
                        //        await targetStream.WriteAsync(memoryStream.ToArray());
 | 
						|
                        //    }
 | 
						|
                        //}
 | 
						|
 | 
						|
 | 
						|
                        #endregion
 | 
						|
 | 
						|
 | 
						|
                        var attachmentPath = $"/UploadFile/{type}/{trustedFileNameForFileStorage}";
 | 
						|
 | 
						|
                        return new JsonResult(ResponseOutput.Ok(new UploadFileInfoDTO() { FilePath = attachmentPath, FullFilePath =  attachmentPath + "?access_token=" + HttpContext.Request.Headers["Authorization"].ToString().Substring(7) }));
 | 
						|
                    }
 | 
						|
 | 
						|
                    section = await reader.ReadNextSectionAsync();
 | 
						|
                }
 | 
						|
                return Created(nameof(FileController), null);
 | 
						|
 | 
						|
 | 
						|
            }
 | 
						|
            return new JsonResult(ResponseOutput.NotOk("服务器端映射路径操作失败"));
 | 
						|
            #endregion
 | 
						|
        }
 | 
						|
 | 
						|
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// 写文件导到磁盘
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="stream">流</param>
 | 
						|
        /// <param name="path">文件保存路径</param>
 | 
						|
        /// <returns></returns>
 | 
						|
        public static async Task<int> WriteFileAsync(System.IO.Stream stream, string path)
 | 
						|
        {
 | 
						|
            const int FILE_WRITE_SIZE = 84975;//写出缓冲区大小
 | 
						|
            int writeCount = 0;
 | 
						|
            using (FileStream fileStream = new FileStream(path, FileMode.Create, FileAccess.Write, FileShare.Write, FILE_WRITE_SIZE, true))
 | 
						|
            {
 | 
						|
                byte[] byteArr = new byte[FILE_WRITE_SIZE];
 | 
						|
                int readCount = 0;
 | 
						|
                while ((readCount = await stream.ReadAsync(byteArr, 0, byteArr.Length)) > 0)
 | 
						|
                {
 | 
						|
                    await fileStream.WriteAsync(byteArr, 0, readCount);
 | 
						|
                    writeCount += readCount;
 | 
						|
                }
 | 
						|
            }
 | 
						|
            return writeCount;
 | 
						|
 | 
						|
          
 | 
						|
        }
 | 
						|
 | 
						|
 | 
						|
       
 | 
						|
 | 
						|
        #region 上传无影响部分
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// 下载多个医生的所有附件
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="doctorIds"></param>
 | 
						|
        /// <returns></returns>
 | 
						|
 | 
						|
        [HttpPost, Route("downloadDoctorAttachments")]
 | 
						|
        public async Task<IResponseOutput<UploadFileInfoDTO>> DownloadAttachment(Guid[] doctorIds)
 | 
						|
        {
 | 
						|
 | 
						|
            var path = await _fileService.CreateDoctorsAllAttachmentZip(doctorIds);
 | 
						|
 | 
						|
            return ResponseOutput.Ok(new UploadFileInfoDTO
 | 
						|
            {
 | 
						|
                FilePath = path,
 | 
						|
                FullFilePath =  path + "?access_token=" + HttpContext.Request.Headers["Authorization"].ToString().Substring(7)
 | 
						|
 | 
						|
            });     
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// 下载医生官方简历
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="language"></param>
 | 
						|
        /// <param name="doctorIds"></param>
 | 
						|
        /// <returns></returns>
 | 
						|
        [HttpPost, Route("downloadOfficialCV/{language}")]
 | 
						|
        public async Task<IResponseOutput<UploadFileInfoDTO>> DownloadOfficialResume(int language, Guid[] doctorIds)
 | 
						|
        {
 | 
						|
 | 
						|
            var path = _fileService.CreateDoctorsAllAttachmentZip(doctorIds);
 | 
						|
            return ResponseOutput.Ok(new UploadFileInfoDTO
 | 
						|
            {
 | 
						|
                FilePath = await _fileService.CreateOfficialResumeZip(language, doctorIds),
 | 
						|
                FullFilePath =  path + "?access_token=" + HttpContext.Request.Headers["Authorization"].ToString().Substring(7)
 | 
						|
            });
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// 下载指定医生的指定附件
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="doctorId">医生Id</param>
 | 
						|
        /// <param name="attachmentIds">要下载的附件Id</param>
 | 
						|
        /// <returns></returns>
 | 
						|
        [HttpPost, Route("downloadByAttachmentId/{doctorId}")]
 | 
						|
        public async Task<IResponseOutput<UploadFileInfoDTO>> DownloadAttachmentById(Guid doctorId, Guid[] attachmentIds)
 | 
						|
        {
 | 
						|
            var path = await _fileService.CreateZipPackageByAttachment(doctorId, attachmentIds);
 | 
						|
            return ResponseOutput.Ok(new UploadFileInfoDTO
 | 
						|
            {
 | 
						|
                FilePath = await _fileService.CreateZipPackageByAttachment(doctorId, attachmentIds),
 | 
						|
                FullFilePath =  path + "?access_token=" + HttpContext.Request.Headers["Authorization"].ToString().Substring(7)
 | 
						|
            });
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
 | 
						|
        #region 废弃
 | 
						|
 | 
						|
        public class UploadDTFCommand
 | 
						|
        {
 | 
						|
            public Guid TrialId { get; set; }
 | 
						|
            public Guid SiteId { get; set; }
 | 
						|
            public Guid SubjectId { get; set; }
 | 
						|
            public Guid SubjectVisitId { get; set; }
 | 
						|
 | 
						|
        }
 | 
						|
        /// <summary>
 | 
						|
        /// 流式上传 临时文件
 | 
						|
        /// </summary>
 | 
						|
        /// <returns></returns>
 | 
						|
        [HttpPost("UploadDTF/{trialId:guid}/{siteId:guid}/{subjectId:guid}/{subjectVisitId:guid}/{studyId:guid}")]
 | 
						|
        [DisableFormValueModelBinding]
 | 
						|
        [DisableRequestSizeLimit]
 | 
						|
        [Obsolete]
 | 
						|
        public async Task<IResponseOutput> UploadingStream(Guid trialId, Guid siteId, Guid subjectId, Guid subjectVisitId, Guid studyId, [FromServices] IStudyDTFService studyDTFService)
 | 
						|
        {
 | 
						|
 | 
						|
            //上传根路径
 | 
						|
            string uploadFolderPath = Path.Combine(defaultUploadFilePath, "Dicom");
 | 
						|
 | 
						|
 | 
						|
            var dtfPath = Path.Combine(uploadFolderPath, DateTime.Now.Year.ToString(), trialId.ToString(),
 | 
						|
                siteId.ToString(), subjectId.ToString(), subjectVisitId.ToString());
 | 
						|
 | 
						|
            if (!Directory.Exists(dtfPath))
 | 
						|
            {
 | 
						|
                Directory.CreateDirectory(dtfPath);
 | 
						|
            }
 | 
						|
 | 
						|
 | 
						|
            #region 之前DTF 先上传临时文件,再拷贝
 | 
						|
            ////上传根路径
 | 
						|
            //string uploadFolderPath = Path.Combine(defaultUploadFilePath, "UploadFile");
 | 
						|
            ////文件类型路径处理
 | 
						|
            //var uploadTempFilePath = Path.Combine(uploadFolderPath, "TempFile");
 | 
						|
            //if (!Directory.Exists(uploadTempFilePath)) Directory.CreateDirectory(uploadTempFilePath);
 | 
						|
 | 
						|
 | 
						|
            //var trustedFileNameForFileStorage = Guid.NewGuid().ToString() + fileNameEX;
 | 
						|
 | 
						|
            //await WriteFileAsync(section.Body, Path.Combine(uploadTempFilePath, trustedFileNameForFileStorage));
 | 
						|
 | 
						|
            //var attachmentPath = $"{uploadTempFilePath}/{trustedFileNameForFileStorage}";
 | 
						|
 | 
						|
            ////多个文件上传,在这里返回就不合适,需要在外层,返回所有的文件路径,实际需要时再更改
 | 
						|
            //return ResponseOutput.Ok(new UploadFileInfoDTO() { FilePath = attachmentPath });
 | 
						|
 | 
						|
            #endregion
 | 
						|
 | 
						|
 | 
						|
            //获取boundary
 | 
						|
            var boundary = HeaderUtilities.RemoveQuotes(MediaTypeHeaderValue.Parse(Request.ContentType).Boundary).Value;
 | 
						|
            //得到reader
 | 
						|
            var reader = new MultipartReader(boundary, HttpContext.Request.Body);
 | 
						|
 | 
						|
            var section = await reader.ReadNextSectionAsync();
 | 
						|
 | 
						|
            //读取section
 | 
						|
            while (section != null)
 | 
						|
            {
 | 
						|
                var hasContentDispositionHeader = ContentDispositionHeaderValue.TryParse(section.ContentDisposition, out var contentDisposition);
 | 
						|
                if (hasContentDispositionHeader)
 | 
						|
                {
 | 
						|
                    var realName = contentDisposition.FileName.Value;
 | 
						|
 | 
						|
                    var fileNameEX = Path.GetExtension(contentDisposition.FileName.Value);
 | 
						|
                    var trustedFileNameForFileStorage = Guid.NewGuid().ToString() + fileNameEX;
 | 
						|
 | 
						|
 | 
						|
                    var relativePath = $"/Dicom/{DateTime.Now.Year.ToString()}/{trialId}/{siteId}/{subjectId}/{subjectVisitId}/{trustedFileNameForFileStorage}";
 | 
						|
                    studyDTFService.AddStudyDTF(new Core.Application.Contracts.Dicom.DTO.StudyDTFAddOrUpdateCommand()
 | 
						|
                    {
 | 
						|
                        StudyId = studyId,
 | 
						|
 | 
						|
                        FileName = realName,
 | 
						|
 | 
						|
                        Path = relativePath
 | 
						|
                    });
 | 
						|
 | 
						|
                    await WriteFileAsync(section.Body, Path.Combine(dtfPath, trustedFileNameForFileStorage));
 | 
						|
 | 
						|
                    //仅仅返回一个文件,如果多文件上传  在最后返回多个路径
 | 
						|
                    return ResponseOutput.Ok(new UploadFileInfoDTO() { FilePath = relativePath, FullFilePath = relativePath + "?access_token=" + HttpContext.Request.Headers["Authorization"].ToString().Substring(7) });
 | 
						|
                }
 | 
						|
                section = await reader.ReadNextSectionAsync();
 | 
						|
            }
 | 
						|
            return ResponseOutput.NotOk("Upload error");
 | 
						|
        }
 | 
						|
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// 流式上传 非Dicom文件
 | 
						|
        /// </summary>
 | 
						|
        /// <returns></returns>
 | 
						|
        [HttpPost("UploadNoneDICOM")]
 | 
						|
        [DisableFormValueModelBinding]
 | 
						|
        [DisableRequestSizeLimit]
 | 
						|
        [Obsolete]
 | 
						|
        public async Task<IResponseOutput> UploadingNoneDicomStream([FromForm] ArchiveStudyCommand archiveStudyCommand, [FromServices] IStudyService studyService)
 | 
						|
        {
 | 
						|
            //上传根路径
 | 
						|
            string uploadFolderPath = Path.Combine(defaultUploadFilePath, "Dicom");
 | 
						|
 | 
						|
            //文件类型路径处理
 | 
						|
            //var noneDicomPath = Path.Combine(uploadFolderPath, DateTime.Now.Year.ToString(), archiveStudyCommand.TrialId.ToString(),
 | 
						|
            //    archiveStudyCommand.SiteId.ToString(), archiveStudyCommand.SubjectId.ToString(), archiveStudyCommand.SubjectVisitId.ToString(), "Data");
 | 
						|
 | 
						|
            //var dtfPath = Path.Combine(uploadFolderPath, DateTime.Now.Year.ToString(), archiveStudyCommand.TrialId.ToString(),
 | 
						|
            //    archiveStudyCommand.SiteId.ToString(), archiveStudyCommand.SubjectId.ToString(), archiveStudyCommand.SubjectVisitId.ToString());
 | 
						|
 | 
						|
            var noneDicomPath = string.Empty;
 | 
						|
 | 
						|
            var dtfPath = string.Empty;
 | 
						|
 | 
						|
            var tempDtfPath = Path.Combine(defaultUploadFilePath/*, archiveStudyCommand.DTFPath*/);
 | 
						|
 | 
						|
 | 
						|
            if (!Directory.Exists(noneDicomPath))
 | 
						|
            {
 | 
						|
                Directory.CreateDirectory(noneDicomPath);
 | 
						|
            }
 | 
						|
            if (!System.IO.File.Exists(tempDtfPath))
 | 
						|
            {
 | 
						|
                return ResponseOutput.NotOk("DTF file can not found");
 | 
						|
            }
 | 
						|
 | 
						|
            System.IO.File.Move(tempDtfPath, dtfPath);
 | 
						|
 | 
						|
            var saveFileDic = new Dictionary<string, string>();
 | 
						|
 | 
						|
            //获取boundary
 | 
						|
            var boundary = HeaderUtilities.RemoveQuotes(MediaTypeHeaderValue.Parse(Request.ContentType).Boundary).Value;
 | 
						|
            //得到reader
 | 
						|
            var reader = new MultipartReader(boundary, HttpContext.Request.Body);
 | 
						|
 | 
						|
            var section = await reader.ReadNextSectionAsync();
 | 
						|
 | 
						|
            //读取section
 | 
						|
            while (section != null)
 | 
						|
            {
 | 
						|
                var hasContentDispositionHeader = ContentDispositionHeaderValue.TryParse(section.ContentDisposition, out var contentDisposition);
 | 
						|
                if (hasContentDispositionHeader)
 | 
						|
                {
 | 
						|
                    var fileName = contentDisposition.FileName.Value;
 | 
						|
                    var fileNameEX = Path.GetExtension(contentDisposition.FileName.Value);
 | 
						|
                    var trustedFileNameForFileStorage = Guid.NewGuid() + fileNameEX;
 | 
						|
 | 
						|
 | 
						|
 | 
						|
                    await WriteFileAsync(section.Body, Path.Combine(noneDicomPath, trustedFileNameForFileStorage));
 | 
						|
 | 
						|
                    var attachmentPath = $"{noneDicomPath}/{trustedFileNameForFileStorage}";
 | 
						|
 | 
						|
                    saveFileDic.Add(attachmentPath, fileName);
 | 
						|
 | 
						|
 | 
						|
                }
 | 
						|
                section = await reader.ReadNextSectionAsync();
 | 
						|
            }
 | 
						|
 | 
						|
            //处理数据库操作
 | 
						|
 | 
						|
            //studyService.DealNonDicomFile(saveFileDic, archiveStudyCommand);
 | 
						|
            return ResponseOutput.Ok(saveFileDic);
 | 
						|
        }
 | 
						|
        #endregion
 | 
						|
 | 
						|
    }
 | 
						|
}
 |