/// <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; } }
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); }
/// <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); } } }