Esempio n. 1
0
        /// <summary>
        /// 由文件串(通常作为服务器端文件名)得到文件信息
        /// </summary>
        /// <param name="fileString">文件串</param>
        //public UploadFileInfo(string fileString)
        //{
        //    Init(fileString);
        //}

        protected void Init(string fileString)
        {
            if (fileString.IndexOf(UPLOAD_FINISHED_FLAG + "+") == 0)
            {
                try
                {
                    string   _fileString    = fileString.Substring(UPLOAD_FINISHED_FLAG.Length, (fileString.Length - UPLOAD_FINISHED_FLAG.Length - 1));
                    string[] _fileStringArr = _fileString.Split('+');
                    string   _timeString    = _fileStringArr[0];

                    this._uploadCompletedDateTime = new DateTime(
                        int.Parse(_timeString.Substring(0, 4)),
                        int.Parse(_timeString.Substring(3, 2)),
                        int.Parse(_timeString.Substring(5, 2)),
                        int.Parse(_timeString.Substring(7, 2)),
                        int.Parse(_timeString.Substring(9, 2)),
                        int.Parse(_timeString.Substring(11, 2)),
                        int.Parse(_timeString.Substring(13, 1))
                        );

                    //this._fileName = _fileStringArr[2];
                    this._uploadState = FileUploadState.FINISHED;
                }
                catch
                {
                    this._uploadState = FileUploadState.UNKNOWN;
                    //this._fileName = fileString;
                }
            }
            else if (fileString.IndexOf(UPLOAD_UNFINISHED_FLAG + "+") == 0)
            {
                try
                {
                    string[] _fileStringArr = fileString.Split('+');
                    this._userId = _fileStringArr[1];
                    //this._lastClientWriteDateTime = DateTime.FromFileTime(long.Parse(_fileStringArr[2]));
                    this._fileLength = long.Parse(_fileStringArr[2]);
                    //this._fileName = _fileStringArr[3];

                    this._uploadState = FileUploadState.UNFINISHED;
                }
                catch
                {
                    this._uploadState = FileUploadState.UNKNOWN;
                    //this._fileName = fileString;
                }
            }
            else
            {
                this._uploadState = FileUploadState.UNKNOWN;
                //this._fileName = fileString;
            }
        }
Esempio n. 2
0
        public const string UPLOAD_UNKNOWN_FLAG    = "T";   // 未知状态文件前缀

        // 由文件状态获得文件Flag
        private static string GetFlagByState(FileUploadState fileState)
        {
            string flagStr = UploadFileInfo.UPLOAD_UNKNOWN_FLAG;

            switch (fileState)
            {
            case FileUploadState.FINISHED:
                flagStr = UploadFileInfo.UPLOAD_FINISHED_FLAG;
                break;

            case FileUploadState.UNFINISHED:
                flagStr = UploadFileInfo.UPLOAD_UNFINISHED_FLAG;
                break;

            default:
                flagStr = UploadFileInfo.UPLOAD_UNKNOWN_FLAG;
                break;
            }

            return(flagStr);
        }
Esempio n. 3
0
        /// <summary>
        /// Uploads the file.
        /// </summary>
        public void UploadFile(Stream stream, RelativePath destPath, out bool fileAccepted,
                               CancellationToken?cancellationToken = null)
        {
            if (stream == null)
            {
                throw new ArgumentNullException(nameof(stream));
            }
            if (destPath == null)
            {
                throw new ArgumentNullException(nameof(destPath));
            }

            RestoreConnection();

            // request permission to upload file
            const int FileDataIndex    = ArgumentIndex + 9;
            const int BlockCapacity    = BufferLenght - FileDataIndex;
            long      bytesToReadTotal = stream.Length;
            int       blockCount       = (int)Math.Ceiling((double)bytesToReadTotal / BlockCapacity);

            DataPacket request = CreateRequest(FunctionID.UploadFile);
            int        index   = ArgumentIndex;

            CopyInt32(0, outBuf, ref index);
            CopyInt32(blockCount, outBuf, ref index);
            CopyFileName(destPath.DirectoryID, destPath.Path, outBuf, ref index);
            request.BufferLength = index;
            SendRequest(request);

            ReceiveResponse(request);
            fileAccepted = inBuf[ArgumentIndex] > 0;

            // upload file
            if (fileAccepted)
            {
                int             blockNumber    = 0;
                long            bytesReadTotal = 0;
                int             bytesRead;
                FileUploadState uploadState = FileUploadState.DataAvailable;
                request = null;

                while (uploadState == FileUploadState.DataAvailable)
                {
                    if (cancellationToken.HasValue && cancellationToken.Value.IsCancellationRequested)
                    {
                        // cancel upload
                        bytesRead   = 0;
                        uploadState = FileUploadState.UploadCanceled;
                    }
                    else
                    {
                        // read from file
                        int bytesToRead = (int)Math.Min(bytesToReadTotal - bytesReadTotal, BlockCapacity);
                        bytesRead       = stream.Read(outBuf, FileDataIndex, bytesToRead);
                        bytesReadTotal += bytesRead;

                        if (bytesRead < bytesToRead || bytesReadTotal == bytesToReadTotal)
                        {
                            uploadState = FileUploadState.EndOfFile;
                        }
                    }

                    // send data
                    request = CreateRequest(FunctionID.UploadFile, 0, false);
                    index   = ArgumentIndex;
                    CopyInt32(++blockNumber, outBuf, ref index);
                    CopyByte((byte)uploadState, outBuf, ref index);
                    CopyInt32(bytesRead, outBuf, ref index);
                    request.BufferLength = FileDataIndex + bytesRead;
                    SendRequest(request);
                    OnProgress(blockNumber, blockCount);
                }

                if (request != null)
                {
                    ReceiveResponse(request);
                }
            }
        }