public string Download(INFile inFile) { var filePath = GetTempPath(inFile.Modified.ToFileTimeUtc() + "_" + inFile.Id); if (File.Exists(filePath)) { File.Delete(filePath); } using (BinaryWriter file = new BinaryWriter(File.OpenWrite(filePath))) { var filePos = _fileArchiveApi.GetFilePosition(inFile.Id); long fileSize = inFile.Size; while (fileSize > 0) { int chunkSize = fileSize > CHUNK_SIZE ? CHUNK_SIZE : (int)fileSize; var data = _fileArchiveApi.GetFileChunk(inFile.Id, filePos + inFile.Size - fileSize, chunkSize); file.Write(data); fileSize -= chunkSize; } file.Close(); } return(filePath); }
private void CreateFile(INFile file) { long pos = 0; if (file.Size > _minResumeUploadFileSize) { //опросить сервер о состоянии этого файла pos = _fileArchiveApi.GetFilePosition(file.Id); if (pos > file.Size) { throw new Exception(string.Format("File with id {0} is corrupted", file.Id)); } } // учтем в прогрессе уже загруженные данные _uploaded += pos; //отправим тело на сервер using (var fs = _storageProvider.Open(file.Id)) { if (file.Size != fs.Length) { throw new Exception(string.Format("Local file size is incorrect: {0}", file.Id)); } const int MAX_ATTEMPT_COUNT = 5; int attemptCount = 0; bool succeed = false; do { UploadData(fs, file.Id, pos); try { _fileArchiveApi.PutFileInArchive(file.Dto.Body); succeed = true; } catch (Exception e) { _logger.Error("при загрузке файла произошла ошибка", e); pos = 0; _uploaded = 0; } attemptCount++; } while (!succeed && attemptCount < MAX_ATTEMPT_COUNT); if (!succeed) { throw new PilotException(string.Format("Unable to upload file {0}", file.Id)); } } }
private void AddObjectsToArchive(IServerApiService apiService, IEnumerable<PObject> objects, ZipArchive archive, string currentPath, string actor) { var stack = new Stack<PObject>(); foreach (var child in objects) { stack.Push(child); } while (stack.Any()) { var pObject = stack.Pop(); if (pObject.Children.Any()) { var childrenIds = pObject.Children.Select(c => c.ObjectId).ToArray(); var children = apiService.GetObjects(childrenIds); foreach (var child in children) { stack.Push(child); } } if (pObject.Type.HasFiles) { INFile dFile = null; string entryName; if (pObject.Type.Name == SystemTypes.PROJECT_FILE) { dFile = pObject.ActualFileSnapshot.Files.FirstOrDefault(f => !FileExtensionHelper.IsSystemFile(f.Name)); if (dFile == null) continue; entryName = dFile.Name; } else { dFile = pObject.ActualFileSnapshot.Files.FirstOrDefault(f => FileExtensionHelper.IsXpsAlike(f.Name) || FileExtensionHelper.IsPdfAlike(f.Name)); if (dFile == null) continue; entryName = $"{pObject.Title}{Path.GetExtension(dFile.Name)}"; } var fileBody = InternalDownloadFile(pObject, actor); if (archive.Entries.Any(x => x.Name == entryName)) entryName += " Conflicted"; var zipEntry = archive.CreateEntry(Path.Combine(currentPath, entryName), CompressionLevel.NoCompression); //Get the stream of the attachment using (var originalFileStream = new MemoryStream(fileBody)) using (var zipEntryStream = zipEntry.Open()) { //Copy the attachment stream to the zip entry stream originalFileStream.CopyTo(zipEntryStream); } } //else //{ // var directoryPath = Path.Combine(currentPath, dir.Title); // if (archive.Entries.Any(x => x.Name == dir.Title)) // directoryPath += " Conflicted"; // var entry = archive.GetEntry(currentPath); // entry?.Archive?.CreateEntry(directoryPath); //} } }