Ejemplo n.º 1
0
        /// <summary>
        /// 下载模板或已存在的文件
        /// </summary>
        public static void Download(object sender, BeforeFileDownloadHandler beforeDownloadHandler, PrepareDownloadStreamHandler prepareDownloadStreamHandler, bool raiseEvent)
        {
            ObjectContextCache.Instance["FileUploadProcessed"] = true;

            HttpResponse response = HttpContext.Current.Response;

            bool fileReadonly = WebUtility.GetRequestQueryValue <bool>("fileReadonly", false);

            string materialID = string.Empty;

            try
            {
                string controlID = WebUtility.GetRequestQueryValue("controlID", string.Empty);

                FileDownloadInfo downloadInfo = FileDownloadInfo.CollectInfoFromRequest();

                if (File.Exists(downloadInfo.FileFullPath) == false)
                {
                    //是否需要启用映射机制(归档后,文件根目录的映射)
                    string mappedRootPath = AppPathMappingContext.GetMappedPathName(downloadInfo.RootPathName);

                    downloadInfo.FileFullPath = GetFileFullPath(downloadInfo.PathType, mappedRootPath, downloadInfo.FilePath);
                }

                response.ContentType = FileConfigHelper.GetFileContentType(downloadInfo.FileName);

                materialID = WebUtility.GetRequestQueryValue("materialID", string.Empty);

                if (materialID.IsNullOrEmpty())
                {
                    materialID = UuidHelper.NewUuidString();
                }

                if (fileReadonly)
                {
                    WebFileOpenMode openMode = FileConfigHelper.GetFileOpenMode(downloadInfo.FileName, downloadInfo.UserID);

                    response.AppendHeader("content-disposition",
                                          string.Format("{0};filename={1}", openMode == WebFileOpenMode.Inline ? "inline" : "attachment", response.EncodeFileNameInContentDisposition(downloadInfo.FileName)));
                }
                else
                {
                    string fileIconPath = FileConfigHelper.GetFileIconPath(downloadInfo.FileName);

                    response.AppendHeader("fileIconPath", HttpUtility.UrlEncode("message=" + fileIconPath));
                    response.AppendHeader("content-disposition", "attachment;fileName=" + response.EncodeFileNameInContentDisposition(downloadInfo.FileName));

                    if (downloadInfo.PathType != PathType.relative)
                    {
                        response.AppendHeader("materialID", "message=" + materialID);
                    }
                }

                bool responseFile = true;

                if (beforeDownloadHandler != null && raiseEvent)
                {
                    responseFile = beforeDownloadHandler(sender, downloadInfo);
                }

                if (responseFile)
                {
                    IMaterialContentPersistManager persistManager =
                        GetMaterialContentPersistManager(materialID, new FileInfo(downloadInfo.FileFullPath));

                    using (Stream stream = persistManager.GetMaterialContent(materialID))
                    {
                        if (prepareDownloadStreamHandler != null && raiseEvent)
                        {
                            PrepareDownloadStreamEventArgs args = new PrepareDownloadStreamEventArgs();

                            args.DownloadInfo = downloadInfo;
                            args.InputStream  = stream;
                            args.OutputStream = response.OutputStream;

                            prepareDownloadStreamHandler(sender, args);
                        }
                        else
                        {
                            stream.CopyTo(response.OutputStream);
                        }
                    }
                }

                Control control = null;

                if (controlID.IsNotEmpty())
                {
                    control = WebControlUtility.FindControlByID((Page)HttpContext.Current.CurrentHandler, controlID, true);
                }

                if (control != null && control is MaterialControl)
                {
                    DownloadEventArgs args = new DownloadEventArgs(materialID, downloadInfo.FilePath);
                    ((MaterialControl)control).OnDownloadFile(args);
                }
            }
            catch (Exception ex)
            {
                if (fileReadonly)
                {
                    response.Write(ex.Message);
                }
                else
                {
                    GenerateErrorInformation(ex.ToString());
                }
            }
            finally
            {
                try
                {
                    response.End();
                }
                catch
                {
                }
            }
        }
Ejemplo n.º 2
0
		/// <summary>
		/// 下载模板或已存在的文件
		/// </summary>
		public static void Download(object sender, BeforeFileDownloadHandler beforeDownloadHandler, PrepareDownloadStreamHandler prepareDownloadStreamHandler, bool raiseEvent)
		{
			ObjectContextCache.Instance["FileUploadProcessed"] = true;

			HttpResponse response = HttpContext.Current.Response;

			bool fileReadonly = Request.GetRequestQueryValue<bool>("fileReadonly", false);

			string materialID = string.Empty;

			try
			{
				string controlID = Request.GetRequestQueryValue("controlID", string.Empty);

				FileDownloadInfo downloadInfo = FileDownloadInfo.CollectInfoFromRequest();

				if (File.Exists(downloadInfo.FileFullPath) == false)
				{
					//是否需要启用映射机制(归档后,文件根目录的映射)
					string mappedRootPath = AppPathMappingContext.GetMappedPathName(downloadInfo.RootPathName);

					downloadInfo.FileFullPath = GetFileFullPath(downloadInfo.PathType, mappedRootPath, downloadInfo.FilePath);
				}

				response.ContentType = FileConfigHelper.GetFileContentType(downloadInfo.FileName);

				materialID = Request.GetRequestQueryValue("materialID", string.Empty);

				if (materialID.IsNullOrEmpty())
					materialID = UuidHelper.NewUuidString();

				if (fileReadonly)
				{
					WebFileOpenMode openMode = FileConfigHelper.GetFileOpenMode(downloadInfo.FileName, downloadInfo.UserID);

					response.AppendHeader("content-disposition",
						string.Format("{0};filename={1}", openMode == WebFileOpenMode.Inline ? "inline" : "attachment", response.EncodeFileNameInContentDisposition(downloadInfo.FileName)));
				}
				else
				{
					string fileIconPath = FileConfigHelper.GetFileIconPath(downloadInfo.FileName);

					response.AppendHeader("fileIconPath", HttpUtility.UrlEncode("message=" + fileIconPath));
					response.AppendHeader("content-disposition", "attachment;fileName=" + response.EncodeFileNameInContentDisposition(downloadInfo.FileName));

					if (downloadInfo.PathType != PathType.relative)
						response.AppendHeader("materialID", "message=" + materialID);
				}

				bool responseFile = true;

				if (beforeDownloadHandler != null && raiseEvent)
					responseFile = beforeDownloadHandler(sender, downloadInfo);

				if (responseFile)
				{
					IMaterialContentPersistManager persistManager =
						GetMaterialContentPersistManager(materialID, new FileInfo(downloadInfo.FileFullPath));

					using (Stream stream = persistManager.GetMaterialContent(materialID))
					{
						if (prepareDownloadStreamHandler != null && raiseEvent)
						{
							PrepareDownloadStreamEventArgs args = new PrepareDownloadStreamEventArgs();

							args.DownloadInfo = downloadInfo;
							args.InputStream = stream;
							args.OutputStream = response.OutputStream;

							prepareDownloadStreamHandler(sender, args);
						}
						else
						{
							stream.CopyTo(response.OutputStream);
						}
					}
				}

				Control control = null;

				if (controlID.IsNotEmpty())
					control = ((Page)HttpContext.Current.CurrentHandler).FindControlByID(controlID, true);

				//todo,MaterialControl
				//if (control != null && control is MaterialControl)
				//{
				//    DownloadEventArgs args = new DownloadEventArgs(materialID, downloadInfo.FilePath);
				//    ((MaterialControl)control).OnDownloadFile(args);
				//}
			}
			catch (Exception ex)
			{
				if (fileReadonly)
					response.Write(ex.Message);
				else
					GenerateErrorInformation(ex.ToString());
			}
			finally
			{
				try
				{
					response.End();
				}
				catch
				{
				}
			}
		}