Ejemplo n.º 1
0
        //public ActionResult Test()
        //{
        //    string accessToken = "prE27SQYE58WyfmXx0RD6RQSqmKoHHxmGUQTojSgVsL0lV7g1RcI2DpA3ELJdNvdWNjFsR9kMbhC2Mht9bJDPva7ZRcRYRDV73DDUsYpa-YTZBcAIAPVX";
        //    MaterialApi.AddNormalMaterial(accessToken, "D:\\a.jpg", MaterialType.Image);

        //    return View();
        //}

        private FileUploadResult SaveFile()
        {
            FileUploadResult fileUploadResult = new FileUploadResult();

            HttpRequestBase request = this.HttpContext.Request;

            string strFileId = request.Form["txtFileUpload_Id"];

            if (String.IsNullOrEmpty(strFileId))
            {
                fileUploadResult.Message = "参数不正确。";
                return(fileUploadResult);
            }

            Guid fileId = Guid.Parse(strFileId);

            string cachingKey = "fsUploadResult:" + strFileId;

            if (_cachingService.ContainsKey(cachingKey))
            {
                fileUploadResult.Message = "请勿重复上传。";
                _cachingService.Set(cachingKey, fileUploadResult, _uploadResultExpiresIn);
                return(fileUploadResult);
            }

            //鉴权
            string userId = request.Form["txtFileUpload_UserId"];

            if (_controlledCachingService.Contains(userId) == false)
            {
                fileUploadResult.Message = "用户鉴权失败。";
                _cachingService.Set(cachingKey, fileUploadResult, _uploadResultExpiresIn);
                return(fileUploadResult);
            }

            if (request.Files.Count == 0)
            {
                fileUploadResult.Message = "没有要上传的文件。";
                _cachingService.Set(cachingKey, fileUploadResult, _uploadResultExpiresIn);
                return(fileUploadResult);
            }

            if (request.Files.Count > 1)
            {
                fileUploadResult.Message = "一次只能上传一个文件。";
                _cachingService.Set(cachingKey, fileUploadResult, _uploadResultExpiresIn);
                return(fileUploadResult);
            }

            HttpPostedFileBase file = request.Files[0];

            if (file.ContentLength / 1024 > 2048)
            {
                fileUploadResult.Message = String.Format("文件大小请勿超过:{0} KB", 2048);
                _cachingService.Set(cachingKey, fileUploadResult, _uploadResultExpiresIn);
                return(fileUploadResult);
            }

            FileInfo fileInfo = new FileInfo(file.FileName);

            SaveArgs args = new SaveArgs();

            args.Id            = fileId;
            args.Domain        = Guid.Parse(request.Form["txtFileUpload_Domain"]);
            args.FileName      = fileInfo.Name;
            args.FileExtension = fileInfo.Extension;
            //args.MD5 = request.Form["md5"];
            args.UploadDate      = DateTime.Now;
            args.UploadIPAddress = Request.UserHostAddress;
            args.Stream          = file.InputStream;

            //"D:\\WorkFloder\\Linkup\\trunk\\Source Code\\FileService\\Linkup.FileService\\File"
            //最后会有一个控制器的虚拟路径,所以 MapPath("/")
            //args.ServerRootDir = Server.MapPath("/");

            fileUploadResult = _fileManager.Save(args);

            _cachingService.Set(cachingKey, fileUploadResult, _uploadResultExpiresIn);

            return(fileUploadResult);
        }
        internal FileUploadResult Save(SaveArgs args)
        {
            FileUploadResult result = new FileUploadResult();

            //流长度在关闭释放流之后就取不到了
            int length = (int)(args.Stream.Length / 1024);

            FileStream fsWrite = null;
            Stream     stream  = null;
            string     storeFileName;

            #region 存储文件

            try
            {
                string targetDir = Path.Combine(_serverRootDir, "FileStore", args.Domain.ToString());
                if (Directory.Exists(targetDir) == false)
                {
                    Directory.CreateDirectory(targetDir);
                }

                storeFileName = Guid.NewGuid().ToString() + args.FileExtension;

                string outputFileName = Path.Combine(targetDir, storeFileName);

                ////Path.Combine 是 \, HTTP 地址用的是 /
                ////但是序列化时,会对 / 转义成 \/
                //result.RelativeUri = "FileStore" + "/" + _site.SiteInfo.Code + "/" + storeFileName;

                byte[] buffer = new byte[4096];

                fsWrite         = new FileStream(outputFileName, FileMode.Create);
                stream          = args.Stream;
                stream.Position = 0;

                int read = 0;
                do
                {
                    read = stream.Read(buffer, 0, buffer.Length);
                    fsWrite.Write(buffer, 0, read);
                } while (read > 0);
            }
            catch (Exception ex)
            {
                _exceptionHandling.HandleException(ex);
                result.Message = ex.Message;
                result.Success = false;
                return(result);
            }
            finally
            {
                if (fsWrite != null)
                {
                    fsWrite.Flush();
                    fsWrite.Close();
                    fsWrite.Dispose();
                }
                if (stream != null)
                {
                    stream.Close();
                    stream.Dispose();
                }
            }

            #endregion

            //存储数据库记录
            FileRecord record = new FileRecord();
            record.Id              = args.Id;
            record.Domain          = args.Domain;
            record.FileName        = args.FileName;
            record.StoredFileName  = storeFileName;
            record.Length          = length;
            record.MD5             = args.MD5;
            record.UploadDate      = args.UploadDate;
            record.UploadIPAddress = args.UploadIPAddress;

            _dataBase.Insert(record);

            result.Success       = true;
            result.Id            = args.Id;
            result.StoreFilePath = String.Format("FileStore/{0}/{1}", args.Domain, storeFileName);

            return(result);
        }