public async Task <IQueryable <UploadImportFile> > ImportFiles() { if (!Request.Content.IsMimeMultipartContent()) { throw this.ExceptionUnsupportedMediaType(); } ImportProfile profile = null; string identifier = null; var tempDir = FileSystemHelper.TempDir(Guid.NewGuid().ToString()); var provider = new MultipartFormDataStreamProvider(tempDir); try { await Request.Content.ReadAsMultipartAsync(provider); } catch (Exception exception) { FileSystemHelper.ClearDirectory(tempDir, true); throw this.ExceptionInternalServerError(exception); } // find import profile if (provider.FormData.AllKeys.Contains("Id")) { identifier = provider.FormData.GetValues("Id").FirstOrDefault(); profile = _importProfileService.Value.GetImportProfileById(identifier.ToInt()); } else if (provider.FormData.AllKeys.Contains("Name")) { identifier = provider.FormData.GetValues("Name").FirstOrDefault(); profile = _importProfileService.Value.GetImportProfileByName(identifier); } if (profile == null) { FileSystemHelper.ClearDirectory(tempDir, true); throw this.ExceptionNotFound(WebApiGlobal.Error.EntityNotFound.FormatInvariant(identifier.NaIfEmpty())); } var deleteExisting = false; var result = new List <UploadImportFile>(); var unzippedFiles = new List <MultipartFileData>(); var importFolder = profile.GetImportFolder(true, true); var csvTypes = new string[] { ".csv", ".txt", ".tab" }; if (provider.FormData.AllKeys.Contains("deleteExisting")) { var strDeleteExisting = provider.FormData.GetValues("deleteExisting").FirstOrDefault(); deleteExisting = (strDeleteExisting.HasValue() && strDeleteExisting.ToBool()); } // unzip files foreach (var file in provider.FileData) { var import = new UploadImportFile(file.Headers); if (import.FileExtension.IsCaseInsensitiveEqual(".zip")) { var subDir = Path.Combine(tempDir, Guid.NewGuid().ToString()); ZipFile.ExtractToDirectory(file.LocalFileName, subDir); FileSystemHelper.Delete(file.LocalFileName); foreach (var unzippedFile in Directory.GetFiles(subDir, "*.*")) { var content = CloneHeaderContent(unzippedFile, file); unzippedFiles.Add(new MultipartFileData(content.Headers, unzippedFile)); } } else { unzippedFiles.Add(new MultipartFileData(file.Headers, file.LocalFileName)); } } // copy files to import folder if (unzippedFiles.Any()) { using (_rwLock.GetWriteLock()) { if (deleteExisting) { FileSystemHelper.ClearDirectory(importFolder, false); } foreach (var file in unzippedFiles) { var import = new UploadImportFile(file.Headers); var destPath = Path.Combine(importFolder, import.FileName); import.Exists = File.Exists(destPath); switch (profile.FileType) { case ImportFileType.XLSX: import.IsSupportedByProfile = import.FileExtension.IsCaseInsensitiveEqual(".xlsx"); break; case ImportFileType.CSV: import.IsSupportedByProfile = csvTypes.Contains(import.FileExtension, StringComparer.OrdinalIgnoreCase); break; } import.Inserted = FileSystemHelper.Copy(file.LocalFileName, destPath); result.Add(import); } } } FileSystemHelper.ClearDirectory(tempDir, true); return(result.AsQueryable()); }
public async Task <IHttpActionResult> ImportFiles() { if (!Request.Content.IsMimeMultipartContent()) { return(StatusCode(HttpStatusCode.UnsupportedMediaType)); } ImportProfile profile = null; string identifier = null; var tempDir = FileSystemHelper.TempDirTenant(Guid.NewGuid().ToString()); var provider = new MultipartFormDataStreamProvider(tempDir); try { await Request.Content.ReadAsMultipartAsync(provider); } catch (Exception ex) { FileSystemHelper.ClearDirectory(tempDir, true); return(InternalServerError(ex)); } // Find import profile. if (provider.FormData.AllKeys.Contains("Id")) { identifier = provider.FormData.GetValues("Id").FirstOrDefault(); profile = _importProfileService.Value.GetImportProfileById(identifier.ToInt()); } else if (provider.FormData.AllKeys.Contains("Name")) { identifier = provider.FormData.GetValues("Name").FirstOrDefault(); profile = _importProfileService.Value.GetImportProfileByName(identifier); } if (profile == null) { FileSystemHelper.ClearDirectory(tempDir, true); throw Request.NotFoundException(WebApiGlobal.Error.EntityNotFound.FormatInvariant(identifier.NaIfEmpty())); } var startImport = false; var deleteExisting = false; var result = new List <UploadImportFile>(); var unzippedFiles = new List <MultipartFileData>(); var importFolder = profile.GetImportFolder(true, true); var csvTypes = new string[] { ".csv", ".txt", ".tab" }; if (provider.FormData.AllKeys.Contains("deleteExisting")) { var strDeleteExisting = provider.FormData.GetValues("deleteExisting").FirstOrDefault(); deleteExisting = strDeleteExisting.HasValue() && strDeleteExisting.ToBool(); } if (provider.FormData.AllKeys.Contains("startImport")) { var strStartImport = provider.FormData.GetValues("startImport").FirstOrDefault(); startImport = strStartImport.HasValue() && strStartImport.ToBool(); } // Unzip files. foreach (var file in provider.FileData) { var import = new UploadImportFile(file.Headers); if (import.FileExtension.IsCaseInsensitiveEqual(".zip")) { var subDir = Path.Combine(tempDir, Guid.NewGuid().ToString()); ZipFile.ExtractToDirectory(file.LocalFileName, subDir); FileSystemHelper.DeleteFile(file.LocalFileName); foreach (var unzippedFile in Directory.GetFiles(subDir, "*.*")) { var content = CloneHeaderContent(unzippedFile, file); unzippedFiles.Add(new MultipartFileData(content.Headers, unzippedFile)); } } else { unzippedFiles.Add(new MultipartFileData(file.Headers, file.LocalFileName)); } } // Copy files to import folder. if (unzippedFiles.Any()) { using (_rwLock.GetWriteLock()) { if (deleteExisting) { FileSystemHelper.ClearDirectory(importFolder, false); } foreach (var file in unzippedFiles) { var import = new UploadImportFile(file.Headers); var destPath = Path.Combine(importFolder, import.FileName); import.Exists = File.Exists(destPath); switch (profile.FileType) { case ImportFileType.XLSX: import.IsSupportedByProfile = import.FileExtension.IsCaseInsensitiveEqual(".xlsx"); break; case ImportFileType.CSV: import.IsSupportedByProfile = csvTypes.Contains(import.FileExtension, StringComparer.OrdinalIgnoreCase); break; } import.Inserted = FileSystemHelper.CopyFile(file.LocalFileName, destPath); result.Add(import); } } } FileSystemHelper.ClearDirectory(tempDir, true); if (startImport) { var customer = _workContext.Value.CurrentCustomer; if (_permissionService.Value.Authorize(Permissions.System.ScheduleTask.Execute, customer)) { _taskScheduler.Value.RunSingleTask(profile.SchedulingTaskId, new Dictionary <string, string> { { TaskExecutor.CurrentCustomerIdParamName, customer.Id.ToString() }, { TaskExecutor.CurrentStoreIdParamName, _storeContext.Value.CurrentStore.Id.ToString() } }); } } return(Ok(result.AsQueryable())); }