Пример #1
0
        /// <summary>
        /// 文件流异步上传,返回文件guid
        /// </summary>
        /// <param name="request"></param>
        /// <returns></returns>
        public object Post(AsyncsFileUploadRequest request)
        {
            int code = (int)FS_ErrorCode.Request_Success;
            if (base.Request.Files.Length == 0)
            {
                LogUtil.Info(" request.file is null");
                code = (int)FS_ErrorCode.RequestFile_Null;
                return new AsyncsFileUploadResponse { ret = code, message = ErrorCodeDic.GetInstance().CodeMessage(code), File_guid = string.Empty };
            }

            AsyncsFileUploadResponse response = new AsyncsFileUploadResponse();

            try
            {
                ICommonFilesService fileService = new CommonFilesService();
                string fileName = (string.IsNullOrEmpty(request.file_name)) ? base.Request.Files[0].FileName : request.file_name;
                byte[] bytes = streamToBytes(base.Request.Files[0].InputStream);

                code = RequestValid(request, bytes);

                if (code != (int)FS_ErrorCode.Request_Success)
                    return new AsyncsFileUploadResponse { ret = code, message = ErrorCodeDic.GetInstance().CodeMessage(code), File_guid = string.Empty };

                response = fileService.AsynFileUpload(fileName, bytes);
            }
            catch (Exception e)
            {
                string err = string.Format("CommonFileServiceHost.AsyncsFileUploadRequest error = {0}, request = {1}", e.ToString(), JsonUtil<AsyncsFileUploadRequest>.ToJson(request));
                LogUtil.Error(err);
            }

            return response;
        }
Пример #2
0
        public AsyncsFileUploadResponse AsynAmrFileUpload(string fileName, string fileGuid, byte[] bytes)
        {
            if (!RequestValid(fileName, bytes))
                return new AsyncsFileUploadResponse { ret = errorCode, message = ErrorCodeDic.GetInstance().CodeMessage(errorCode), File_guid = string.Empty };

            AsyncsFileUploadResponse response = new AsyncsFileUploadResponse();
            try
            {
                string filePath = string.Empty;
                string fileExtName = (fileName.Split('.').Length == 1) ? "" : fileName.Split('.')[1];
                //string fileGuid = GetShortGuid();
                int file_size = bytes.Length;

                // 计算MD5值, 若相同则不传物理文件至FDFS,只保存一条文件记录
                String fileMD5 = FileOperationHelper.CalculateChunkMD5(bytes);
                FileEntity fileEntity = fileDA_R.GetFileEntityByMD5(fileMD5);

                if (fileEntity != null && fileEntity.file_md5.Equals(fileMD5))  // 文件已存在
                {
                    FileEntity newEntity = new FileEntity
                    {
                        file_guid = fileGuid,
                        file_full_name = fileName,
                        file_path = fileEntity.file_path,
                        file_md5 = fileMD5,
                        file_size = file_size,
                        create_time = StringUtil.GetDateTimeSeconds(DateTime.Now),
                        last_changed_time = StringUtil.GetDateTimeSeconds(DateTime.Now)
                    };
                    long n = fileDA_W.CreateNewFile(newEntity);
                    LogUtil.Info(string.Format("CommonFilesService.AsynAmrFileUpload exits file fileEntity: {0} create result:{1} ",JsonUtil<FileEntity>.ToJson(fileEntity), n));
                }
                else
                {
                    LogUtil.Info(string.Format("CommonFilesService.AsynAmrFileUpload begin upload: {0} fileguid = {1}, bytes Length={2}", fileName, fileGuid, bytes.Length));
                    // 异步上传新文件
                    Stopwatch watch = new Stopwatch();
                    watch.Start();
                    FSManager.BeginUploadFile(bytes, fileName, fileExtName, file_size, (uploadResult, uploadEx) =>
                    {
                        if (null != uploadEx)
                        {
                            LogUtil.Error(string.Format("Error in FSManager.BeginUploadFile callback: {0}", uploadEx.ToString()));
                            return;
                        }
                        if (null == uploadResult || string.IsNullOrEmpty(uploadResult.FilePathOnFDFS))
                        {
                            LogUtil.Error(string.Format("Error in FSManager.BeginUploadFile callback:fdfs file Pash is null. FileName={0},fileSize={1}", fileName, bytes.Length));
                            return;
                        }

                        watch.Stop();
                        string info = string.Format("Async upload at server(ProcessId = {0}, ThreadId = {1}, CurrTheadsNum = {2}): file_guid = {3}, file_full_name = {4}, file_path = {5},"
                                    + " file_md5 = {6}, file_size = {7}, invoking time = {8}ms", Process.GetCurrentProcess().Id, Thread.CurrentThread.ManagedThreadId,
                                    Process.GetCurrentProcess().Threads.Count, fileGuid, fileName, uploadResult.FilePathOnFDFS, fileMD5, bytes.Length, watch.ElapsedMilliseconds);
                        if (watch.ElapsedMilliseconds > 3000)
                        {
                            LogUtil.Error(info);
                            errorCode = (int)FS_ErrorCode.RequestFile_TimeOut;
                        }
                        else
                            LogUtil.Info(info);

                        // 保存FileGuid ,filePath 和FileName, FileSize到数据库
                        watch.Start();
                        FileEntity entity = new FileEntity
                        {
                            file_guid = fileGuid,
                            file_full_name = fileName,
                            file_path = uploadResult.FilePathOnFDFS,
                            file_md5 = fileMD5,
                            file_size = file_size,
                            create_time = StringUtil.GetDateTimeSeconds(DateTime.Now),
                            last_changed_time = StringUtil.GetDateTimeSeconds(DateTime.Now)
                        };
                        fileDA_W.CreateNewFile(entity);
                        watch.Stop();
                        info = string.Format("after async upload: Save to mysql db cost {0}ms. file_guid={1}, file_full_name={2}", watch.ElapsedMilliseconds, entity.file_guid, entity.file_full_name);
                        if (watch.ElapsedMilliseconds > 3000)
                        {
                            LogUtil.Error(info);
                            errorCode = (int)FS_ErrorCode.RequestFile_TimeOut;
                        }
                        else
                            LogUtil.Info(info);
                    });
                }

                response.ret = errorCode;
                response.message = ErrorCodeDic.GetInstance().CodeMessage(errorCode);
                response.File_guid = fileGuid;
            }
            catch (Exception ex)
            {
                LogUtil.Error(string.Format("Exception FSService.Post(): {0}", ex.ToString()));
                errorCode = (int)FS_ErrorCode.RequestFile_UploadErr;
                response.ret = errorCode;
                response.message = ErrorCodeDic.GetInstance().CodeMessage(errorCode);
                response.File_guid = string.Empty;
            }
            return response;
        }