Beispiel #1
0
        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);
        }
Beispiel #2
0
        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);
                //}
            }
        }