File.ashx

合集下载

form表单提交过程

form表单提交过程

Form(表单)对于每个WEB开发人员来说,应该是再熟悉不过的东西了,可它却是页面与WEB服务器交互过程中最重要的信息来源。

虽然 WebForms框架为了帮助我们简化开发工作,做了很完美的封装,让我们只需要简单地使用服务端控件就可以直接操作那些HTML表单元素了。

但我认为了解一些基础的东西,可以使我们不必束缚在WebForms框架上,以及遇到一些奇怪问题时,可以更从容地解决它们。

今天,我将和大家来聊聊表单,这个简单又基础的东西。

我将站在HTML和单纯的 框架的角度来解释它们的工作方式,因此,本文不演示WebForms服务器控件的相关内容。

回到顶部简单的表单,简单的处理方式好了,让我们进入今天的主题,看看下面这个简单的HTML表单。

<form action="Handler1.ashx" method="post" ><p>客户名称: <input type="text" name="CustomerName" style="width:300px" /></p><p>客户电话: <input type="text" name="CustomerTel" style="width: 300px" /></p><p><input type="submit" value="提交" /></p></form>在这个HTML表单中,我定义了二个文本输入框,一个提交按钮,表单将提交到Handler1.ashx中处理,且以POST的方式。

注意哦,如果我们想让纯静态页面也能向服务器提交数据,就可以采用这样方式来处理:将action属性指向一个服务器能处理的地址。

ashx是什么文件,如何创建

ashx是什么文件,如何创建

.ashx文件用于写web handler的。

其实就是带HTML和C#的混合文件。

当然你完全可以用.asp x 的文件后缀。

使用.ashx可以让你专注于编程而不用管相关的WEB技术。

.ashx必须包含IsR eusable. 如下例所示<% @ webhandler language="C#" class="AverageHandler" %>using System;using System.Web;public class AverageHandler : IHttpHandler{public bool IsReusable{ get { return true; } }public void ProcessRequest(HttpContext ctx){ctx.Response.Write("hello");}}.ashx比.aspx的好处在与不用多一个html注意了VS2005中Web应用程序项目模板里的Generic Handler 项,发现它是一个.ashx文件,实际上它是一个HttpHandler。

后来查了一下.Net SDK文档,发现1.1也支持.ashx,但是没有给出详细内容。

我们都知道,HttpHandler是一个彻底自定义Http请求的方法,它通过web.config来定义运行时来过滤出要自定义的Http请求,发送到定义在web.config的指定类中。

利用.ashx文件是一个更好的方法,这个文件类似于.aspx文件,可以通过它来调用HttpHandler类,从而免去了普通.aspx页面的控件解析以及页面处理的过程。

这个文件特别适合于生成动态图片,生成动态文本等内容。

建立方法如下:首先打开一个Web项目,然后在任意目录下使用VS2003解决方案资源管理器的“添加”-->“添加新项”,在对话框中选择“文本文件”,然后在文件名处输入“TextBuilder.ashx”。

file上传控件onchange事件失效的解决方法

file上传控件onchange事件失效的解决方法

最近在做项目时,遇到一些用户操作方面的问题,用户想点击input file控件的浏览就直接将文件读取到列表中,我使用StreamReader读取文件时,遇到IO权限的问题,要想读取文件到StreamReader 中必须对该文件享有User可读权限,许多用户的客户端不可能手动设置给这个用户的权限,考虑到安全问题,我只好先上传到服务器端,然后再读取上传后的文件,这样权限问题就解决了。

但是直接点击input file控件就上传,就要使用异步上传了,我在寻找file 控件的部分事件时,发现onchange竟然存在这样一个问题,第一次浏览时是可以使用的,再浏览时onchange也就不激发了,为什么呢,曾经想过onpropertychange这个事件,尝试后依然不激发。

后来我寻找了一个解决方法,就是每点击浏览激活onchange事件一次,就重新初始化一下这个控件,毕竟第一次onchange是可以激发的。

代码如下:<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN""/T R/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="/1999/xhtml"><head runat="server"><title>无标题页</title><script language="javascript" type="text/javascript" src="js/jquery.pack.js"></ script><script language="javascript" type="text/javascript" src="js/ajaxfileupload.js" ></script><script type="text/javascript">$(function(){$("#File1").change(function(){fileOnchage();});});function fileOnchage(){var content = '\<input id="File1" name="File1" type="file" onchange="fileOnchage(); " />\';$("#dv").append(content);$.ajaxFileUpload({url:'response/Handler.ashx', //需要链接到服务器地址secureuri:false,fileElementId:'File1', //文件选择框的id属性 dataType: 'json', //服务器返回的格式,可以是jsonsuccess: function (data, status){//bind(data);},error: function (data, status, e){alert(e);}});$("#File1").remove();}</script></head><body><form id="form1" method="post" action="" enctype="multipart/form-data"><div id="dv"><input id="File1" name="File1" type="file" /></div></form></body></html>我利用了jquery的remove方法,remove方法只会移除单个元素,所以新添加的会代替原来的继续使用。

百度编辑器(UEditor)上传图片

百度编辑器(UEditor)上传图片

上传图片配置文件:
一开始我上传图片的时候失败,网上有人说需要把net文件夹下的wen.config给删除掉。

修改配置文件后需要到imageUp.ashx页面做如下处理
把箭头指的这段头引用文件给删除掉。

图片就可以上传成功了
效果如下:
到此为止图片上传就搞定了。

附件上传:
附件上传这块需要到配置文件editor_config.js里面做如下处理
然后把net文件夹下面的web.config文件里面的
把这一句加到你项目的跟目录下的web.config
然后这块需要注意的是fileUp.ashx这个页面有设置上次文件大小限制的参数可以根绝自己的实际需求更改。

如果没有上面的操作上传附件的时候很有可能失败!失败情况可能是:
,成功的效果是这样的:
希望能给大家带来方便。

C#——文件上传(一般处理程序ashx)

C#——文件上传(一般处理程序ashx)

C#——⽂件上传(⼀般处理程序ashx)Framework版本:.Net Framework 41、FileInfo实体using System;using System.Collections.Generic;using System.Linq;using System.Web;using MongoDB.Bson;using ReligionServer.util;using ReligionServer.constant;namespace ReligionServer.Model{//为什么会有多余的get set⽅法,因为测试写的,没有删//封装的⼀个⽂件类, ⽂件基本信息public class FileInfo{public ObjectId _id;public String FileCode { get; set; }//⽬前还没有研究出ObjectId序列化的最好解决⽅式, 所以暂时使⽤FileCode替代Id public String Name { get; set; }public String Type { get; set; }public String Desc { get; set; }public String Path { get; set; }public int Access { get; set; }public String ForeignKey { get; set; }public DateTime CreateTime { get; set; }public String TypeCode { get; set; }//辅助字段public FileInfo() { }public void set_Id(ObjectId id){this._id = id;}public ObjectId get_Id(){return this._id;}public void setFileCode(){this.FileCode = CommonUtil.CreateId();}public String getFileCode(){return this.FileCode;}public void setName(String name){ = name;}public String getName(){return ;}public void setType(String type){this.Type = FileTypeConstant.GetType(type);}public String getType(){return this.Type;}public void setDesc(String desc){this.Desc = desc;}public String getDesc(){return this.Desc;}public void setPath(String path){this.Path = path;}public String getPath(){return this.Path;}public void setAccess(int access){this.Access = access;}public int getAccess(){return this.Access;}public void setForeignKey(){this.ForeignKey = CommonUtil.CreateId(); }public String getForeignKey(){return this.ForeignKey;}public void setCreateTime(){this.CreateTime = DateTime.Now;}public DateTime getCreateTime(){return this.CreateTime;}public void setTypeCode(String code){this.TypeCode = code;}public String getTypeCode(){return this.TypeCode;}}}2、Handler具体实现using System;using System.IO;using System.Collections.Generic;using System.Linq;using System.Web;using ReligionServer.util;using ReligionServer.Model;using ReligionServer.service;using System.Text.RegularExpressions;namespace ReligionServer.handler{///<summary>/// FileHandler 的摘要说明///处理⽂件请求///</summary>public class FileHandler : BaseHandler, IHttpHandler{private FileInfoService fileInfoService = new FileInfoService();private readonly String targetSavePath = "~/ReligionFile/";public void ProcessRequest(HttpContext context){base.InitAction(context);}#region⽂件上传//和第三⽅表关联的⽂件上传初始化逻辑public void Upload_Foreign(HttpContext context){Model.FileInfo fileInfo = InitFileInfo(context, 0);if (CommonUtil.IsEmpty(fileInfo.getForeignKey())){NoParams<Model.FileInfo>(context, "关联外键为空, 还请检测关联属性是否上传成功, 外键是否为空");}else if (base.IsEmpty(fileInfo.getTypeCode())){fileInfo.setTypeCode("0");NoParams<Model.FileInfo>(context, "TypeCode is null or '' ...");}else{List<Model.FileInfo> uploadFileList = FileInsert(context, InitFileInfo(context, 0));if (uploadFileList.Count == 0){Error<String>(context, new List<String>() { "上传失败: 后台获取⽂件信息失败" });}else{int errorCount = (int)context.Items["FileUploadErrorCount"];int successCount = uploadFileList.Count - errorCount;Success<String>(context, new List<String>() { "⼀共上传 " + uploadFileList.Count + "个⽂件,其中成功 " + successCount + "个,失败" + errorCount + }}}//⽂件上传初始化逻辑public void Upload(HttpContext context){Model.FileInfo fileInfo = InitFileInfo(context, 1);if (base.IsEmpty(fileInfo.getTypeCode())){fileInfo.setTypeCode("0");NoParams<Model.FileInfo>(context, "TypeCode is null or '' ...");}else {List<Model.FileInfo> uploadFileList = FileInsert(context, fileInfo);if (uploadFileList.Count == 0){Error<String>(context, new List<String>() { "上传失败: 后台获取⽂件信息失败" });}else{int errorCount = (int)context.Items["FileUploadErrorCount"];int successCount = uploadFileList.Count - errorCount;Success<String>(context, new List<String>() { "⼀共上传 " + uploadFileList.Count + "个⽂件,其中成功 " + successCount + "个,失败" + errorCount + }}}///<summary>///供类相互调⽤的⽂件上传///</summary>///<param name="context"></param>///<param name="foreignKey"></param>///<returns></returns>public List<Model.FileInfo> Upload_Invoke(HttpContext context, String foreignKey) {if (!base.IsEmpty(foreignKey)) {Model.FileInfo fileInfo = InitFileInfo(context, 0);fileInfo.ForeignKey = foreignKey;List<Model.FileInfo> uploadFileList = FileInsert(context, fileInfo);return uploadFileList;}return new List<Model.FileInfo>();}//执⾏⽂件转存以及数据库记录插⼊的⽅法private List<Model.FileInfo> FileInsert(HttpContext context, Model.FileInfo fileInfo){List<Model.FileInfo> fileInfoList = new List<Model.FileInfo>();//List<Model.FileInfo> fileInfoList = new List<Model.FileInfo>();String directoryName = DateUtil.CurrentDateTimeValue();//⽂件夹名称//HttpContext.Current.Request.PhysicalApplicationPath 获取当前正在执⾏的服务器应⽤程序的根⽬录的物理⽂件系统路径String targetPhysicalFilePath = HttpContext.Current.Request.PhysicalApplicationPath + "ReligionFile/" + directoryName;//不存在就创建if (!Directory.Exists(targetPhysicalFilePath)){Directory.CreateDirectory(targetPhysicalFilePath);}//获取上传⽂件集合HttpFileCollection fileCollection = context.Request.Files;//HttpPostedFile temp = context.Request.Files["regfile"];//测试//String tempe = context.Request.Params["regfile"];//HttpPostedFileWrapper fileWrapper = context.Request.Files[0];Model.FileInfo tempFileInfo = null;if (fileCollection.Count > 0){HttpPostedFile item = null;for (int i = 0; i < fileCollection.Count; i++){item = fileCollection[i];String suffix = item.FileName.Split('.')[item.FileName.Split('.').Length - 1];//获取⽂件的后缀名tempFileInfo = new Model.FileInfo();tempFileInfo = (Model.FileInfo)BeanUtil.PropCopy(fileInfo, tempFileInfo);//tempFileInfo.set_Id(CommonUtil.CreateObjectId());这样设置Id是⽆效的tempFileInfo.setName(item.FileName);//存的是以前的⽂件名, 是否有意义tempFileInfo.setFileCode();tempFileInfo.setType(suffix);tempFileInfo.setCreateTime();suffix = "." + suffix;if (suffix.ToLower().Equals(".txt")){suffix = ".doc";//这⾥是否有必要? 这是个问题}String realFileName = Guid.NewGuid().ToString() + suffix;tempFileInfo.setTypeCode(tempFileInfo.getTypeCode() + ":" + "ReligionFile/" + directoryName + "/" + realFileName);tempFileInfo.setPath("ReligionFile/" + directoryName + "/" + realFileName);item.SaveAs(context.Server.MapPath(targetSavePath + directoryName + "/" + realFileName));//⽂件转存必须是⽂件的根⽬录, ⽽且不能使虚拟⽬录fileInfoList.Add(tempFileInfo);}//foreach (String key in fileCollection) {//这⾥前台只有⼀个⽂件选择框, 那么多⽂件时keys都是相同的,// HttpPostedFile item = fileCollection[key];// String suffix = item.FileName.Split('.')[item.FileName.Split('.').Length - 1];//获取⽂件的后缀名// fileInfo.setName(item.FileName);// fileInfo.setFileCode();// fileInfo.setType(suffix);// fileInfo.setCreateTime();// suffix = "." + suffix;// if (suffix.ToLower().Equals(".txt")) {// suffix = ".doc";//这⾥是否有必要? 这是个问题// }// String realFileName = Guid.NewGuid().ToString() + suffix;// fileInfo.setTypeCode(fileInfo.getTypeCode() + ":" + "ReligionFile/" + directoryName + realFileName);// item.SaveAs(context.Server.MapPath(targetSavePath + directoryName + "/" + realFileName));//⽂件转存必须是⽂件的根⽬录, ⽽且不能使虚拟⽬录// fileInfoList.Add(fileInfo);//}int errorCount = fileInfoService.InsertBatchFileInfo(fileInfoList);//⽂件信息批量⼊表, 返回失败个数context.Items.Add("FileUploadErrorCount", errorCount);}return fileInfoList;}///<summary>/// Base64格式的图⽚上传///</summary>///<param name="context"></param>public void Insert_Base64_Img(HttpContext context){vo.Base64Image base64Image = base.GetInstance<vo.Base64Image>(context, new vo.Base64Image());if (base.IsEmpty(base64Image.Base64String)){NoParams<vo.Base64Image>(context, "上传参数存在空值");}else{List<Model.FileInfo> fileInfoList = util.ImageUtil.Base64ImageInsertBatch(context, util.ArrraysUtil.PurifyArrays<String>(Regex.Split(base64Image.Base64S if (fileInfoList.Count > 0){int errorCount = fileInfoService.InsertBatchFileInfo(fileInfoList);int successCount = fileInfoList.Count - errorCount;Success<String>(context, new List<String>() { "⼀共上传 " + fileInfoList.Count + "个⽂件,其中成功 " + successCount + "个,失败" + errorCount +}else{Error<String>(context, new List<String>() { "上传失败: 后台将Base64转存时失败" });}}}#endregion#region⽂件删除///<summary>///根据ObjectId删除指定的⽂件信息///</summary>///<param name="context"></param>public void Del_ObjectId(HttpContext context){//暂时不做}///<summary>///根据FileCode删除指定的⽂件信息///</summary>///<param name="context"></param>public void Del_FileCode(HttpContext context){Model.FileInfo fileInfo = this.InitFileInfo(context, -1);fileInfo = fileInfoService.FindFileInfoByFileCode(fileInfo.getFileCode());if (fileInfo != null){if (fileInfoService.RemoveFileInfoByFileCode(fileInfo.getFileCode())){RemoveLocalFile(fileInfo);Success<Model.FileInfo>(context, new List<Model.FileInfo>() { fileInfo });}else{Error<Model.FileInfo>(context, new List<Model.FileInfo>() { fileInfo });}}else{NoParams<Model.FileInfo>(context, "该条记录不存在,⽆法删除");}}///<summary>///根据外键ForeignKey删除所关联的⽂件信息///</summary>///<param name="context"></param>public void Del_ForeignKey(HttpContext context){}///<summary>///根据传递进来的FileInfo的path字段删除服务器上对应的⽂件///</summary>///<param name="fileInfo"></param>private void RemoveLocalFile(Model.FileInfo fileInfo){System.Diagnostics.Debug.WriteLine(HttpContext.Current.Request.PhysicalApplicationPath + fileInfo.getPath());//FileUtil.RemoveFile(context.Request.PhysicalApplicationPath + fileInfo.getPath());FileUtil.RemoveFile(HttpContext.Current.Request.PhysicalApplicationPath + fileInfo.getPath());}#endregion#region⽂件修改///<summary>///根据FileCode修改指定的⽂件信息///</summary>///<param name="context"></param>public void Update_FileCode(HttpContext context){Model.FileInfo target = InitFileInfo(context, -1);String fileCode = target.getFileCode();List<Model.FileInfo> list = null;if (CommonUtil.IsEmpty(target.getForeignKey()) || CommonUtil.IsEmpty(target.getFileCode())){NoParams<Model.FileInfo>(context, "关联外键ForeignKey或FileCode为空");}else{list = FileInsert(context, InitFileInfo(context, 0));}if (null != list){target = list[0];target.FileCode = fileCode;Model.FileInfo source = fileInfoService.FindFileInfoByFileCode(target.getFileCode());if (null != source){target._id = source._id;target.Access = source.Access;target.ForeignKey = source.ForeignKey;if (fileInfoService.UpdateAllByFileCode(target)){RemoveLocalFile(source);//如果上传成功, 就将原来的⽂件删除Success<Model.FileInfo>(context, new List<Model.FileInfo>() { fileInfoService.FindFileInfoByFileCode(target.FileCode) });}else{Error<Model.FileInfo>(context, new List<Model.FileInfo>() { target });RemoveLocalFile(target);//如果更新失败, 就将上传的⽂件删除}}else{Init<Model.FileInfo>(context, "300", "", new List<Model.FileInfo>() { });}}}#endregion#region⽂件查找///<summary>///根据FileCode查找指定的⽂件信息///</summary>///<param name="context"></param>public void Query_FileCode(HttpContext context){Model.FileInfo fileInfo = fileInfoService.FindFileInfoByFileCode(this.InitFileInfo(context, -1).FileCode);if (fileInfo == null){NoParams<Model.FileInfo>(context, "该记录不存在");}else{Success<Model.FileInfo>(context, new List<Model.FileInfo>() { fileInfo });}}///<summary>///根据ForeignKey查询所有的⽂件信息///</summary>///<param name="context"></param>public void Query_Foreign(HttpContext context){//Model.FileInfo info = this.InitFileInfo(context, -1);List<Model.FileInfo> list = fileInfoService.FindFileInfoListByForeignKey(this.InitFileInfo(context, -1).ForeignKey);//if (list == null || list.Count == 0) {// NoParams<Model.FileInfo>(context, "没有匹配的记录");//} else {// Success<Model.FileInfo>(context, list);//}Success<Model.FileInfo>(context, list);}#endregion//初始化FileInfoprivate Model.FileInfo InitFileInfo(HttpContext context, int access){Model.FileInfo fileInfo = ParametersUtil.GetInstanceFormRequest<Model.FileInfo>(context, new Model.FileInfo());//这⾥主要是获取ForeignKey if (access != -1){fileInfo.setAccess(access);//设置⽂件资源类型 {0表⽰关联; 1表⽰独⽴资源,没有关联} -1表⽰不作处理}return fileInfo;}public bool IsReusable {get{return false;}}}}。

上传文件——file标签深藏功与名

上传文件——file标签深藏功与名

上传⽂件——file标签深藏功与名 在Html标签中,<input type="file"/>是被⽤来上传⽂件的,但是这哥们⼉在不同的浏览器下各有⼀副嘴脸,怎⼀个“别扭”了得。

⼀直想解决这个头疼的问题,最近在读了⼀篇博⽂之后,忽然有了思路。

在上传⽂件时,<input type="file"/>是被放在⼀个form中,form既然要上传⽂件,⼀定是以post⽅式传输数据,enctype也要设置成multipart/form-data。

如下:<form id="uploadForm" action="test.ashx" method="post" enctype="multipart/form-data"><input type="file" name="uploadFile" id="uploadFile" style="visibility:hidden;position:absolute;top:0px;width:0px"/></form><input type="button" value="上传" id="btn"/> 既然file标签长得不好看,就不让它显⽰,本来想设置display属性,但是在苹果浏览器下没能实现上传,只好设置visibility为hidden,但这么⼀来,file标签就独占了空⽩的⼀块区域,所以⼜继续设置了后⾯三个属性。

这样页⾯上就只有⼀个button按钮,此时只需要设置按钮点击时触发file标签的点击事件,⽽当选择完上传的⽂件之后,将触发file标签的onchange事件,只需要在此事件中提交form表单的数据即可。

file.exists替代方法

file.exists替代方法

file.exists替代方法在编程中,我们经常需要检查一个文件或目录是否存在。

在许多编程语言中,都有一个名为`exists`的方法或函数,用于实现这个功能。

但是,有时我们可能希望找到一个替代方法,以避免使用某些特定环境或库中的`exists`方法可能存在的限制或问题。

下面是一些替代`exists`方法的建议:1. 使用`os.path.exists`替代在Python中,我们可以使用`os.path.exists`方法来检查文件或目录是否存在。

这个方法需要一个文件或目录路径作为参数,如果文件或目录存在,它会返回`True`,否则返回`False`。

这是一个简单且可靠的替代方法,适用于大多数情况。

示例代码:```pythonimport osfile_path = "path/to/file"if os.path.exists(file_path):print("文件存在")else:print("文件不存在")```2. 使用`os.stat`替代另一个替代方法是使用`os.stat`方法。

这个方法会返回有关文件或目录的信息,包括其存在性。

如果文件或目录存在,它会返回一个表示该文件或目录的元数据对象,否则返回一个空对象。

这种方法在处理大文件时可能会更高效一些。

示例代码:```pythonimport osimport statfile_path = "path/to/file"if os.path.exists(file_path):if os.stat(file_path).st_mode &stat.S_ISDIR(os.stat(file_path).st_mode):print("是一个目录")elif os.access(file_path, os.R_OK):print("可读")else:print("不可读")```3. 使用第三方库的`exists`方法有时,我们可能需要使用第三方库来处理文件和目录操作。

最新整理ewebeditor 上传遇到防火墙限制怎么解决

最新整理ewebeditor 上传遇到防火墙限制怎么解决

e w e b e d i t o r上传遇到防火墙限制怎么解决防火墙主要由服务访问规则、验证工具、包过滤和应用网关4个部分组成,防火墙就是一个位于计算机和它所连接的网络之间的软件或硬件。

今天看了前面的原创帖子说到e w e b遇到a s p,a s a,c e r被限制访问拿不了s h e l l,正好这个问题我是知道的。

应该很多大牛都会的吧,估计还是有些不会的,就将就看看吧方法步骤用默认帐户密码a d m i n a d m i n进入样式添加a s a扩展名直接上传a s p马到这里都是顺利的,但是。

当你访问马的时候。

试过了小马,一句话,会出现同样的问题解决方法:在样式添加里加上扩展名a s h x创建一个 1.a s h x的文件,上传,代码如下:复制代码代码如下:u s i n g S y s t e m;u s i n g S y s t e m.W e b;u s i n g S y s t e m.I O;p u b l i c c l a s s H a n d l e r:I H t t p H a n d l e r{p u b l i c v o i d P r o c e s s R e q u e s t(H t t p C o n t e x tc o n t e x t){c o n t e x t.R e s p o n s e.C o n t e n t T y p e=t e x t/p l a i n;S t r e a m W r i t e r f i l e1=F i l e.C r e a t e T e x t(c o n t e x t.S e r v e r.M a p P a t h(r o o t.a s p ));f i l e1.W r i t e();f i l e1.F l u s h();f i l e1.C l o s e();}p u b l i c b o o l I s R e u s a b l e{g e t{r e t u r n f a l s e;}}}然后直接访问它。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

2005年第3期贵阳师范高等专科学校学报(社会科学版)(季刊)No.3.2005JOURNAL OF GUIYANG TEACHER’S COLLEGE(总第81期)Social Science(Quarterly)(General No.81)浅析中国家电行业营销渠道的发展趋势刘洁(贵阳学院,贵州贵阳550005)摘要:我国正式成为WTO成员国,标志着我国的社会经济发展国际化时期的开始。

中国的社会经济正在经历从传统的计划经济时代,逐步向社会主义市场经济过渡的阶段。

与许多行业一样,中国的家电行业正在经历前所未有的变革。

面对家电行业营销渠道目前的“内忧外患”,进一步完善社会主义的市场经济体制,大力推行创新营销是我们正确的选择。

关键词:家电;营销渠道;发展趋势中图分类号:F724.7 文献标识码:A 文章编号:1002-6894(2005)03-0035-04Briefly on the Trend of Marketing Channels of Chinese Household AppliancesLIU Jie(Guiyang College,Guiyang,Guizhou.550008)Abstract:The day when China was officially admitted into WTO indicates a new period that the development of China’ssocial economy begins to be mixed with the world.China is undergoing a gradually transitional period from traditionalplanned economy to socialist market economy.Like other lines of business,Chinaˊs household appliances are facing un-paralleled reform.Considering how difficult China’s household appliances are at home and abroad,we should choose acorrect method to carry out an innovative selling by improving the system of socialist market economy.Key words:household appliances;selling channels;development trend营销渠道是指产品或服务从生产者向消费者移动过程中,所经过的、由各中间环节联结而成路径。

这些中间环节包括生产者自设的营销机构、批发商、零售商、代理商以及其他中介机构等等。

经过20多年的改革开放,随着我国社会主义市场经济的发展,我国的家电行业得到了空前的发展,取得了令全世界感到惊奇的神话般的成就。

2001年12月,我国正式成为WTO成员国,标志着我国的社会经济发展国际化时期的开始。

在WTO的框架下,我国的家电行业在面临新考验的同时,也会面对新的机遇。

本文将通过对家电行业营销渠道的特征、存在问题的分析,提出相关的对策。

家电行业营销渠道的主要特征目前家电营销渠道的主要类别:一是传统渠道,它主要靠产品本身的品牌效应来销售,具有网络覆盖广,深入各级市场,便于消费者购买,店面面积不大,进入门槛低,发展经销商相对比较容易等优势,但是缺点也显而易见,比如:售点分散、市场管理成本高、单个经销商实力弱等等。

二是连锁渠道,它的劣势是单店投资大、进入门槛高,基本不涉足三四级市场以及与厂家关系不太协调等,但是优势也很明显,比如:统一采购、统一管理、统一品牌,销售半径大等等,这些能够极大地节约销售成本,便于市场推广,相对于传统渠道来说,它更能满足厂收稿日期:2005-05-08作者简介:刘洁(1962-),男,江苏南京人,贵阳学院院长办公室主任,MBA(双证)在读。

家的需要。

在经营模式和管理上的主要特征是:(一)三种不同的经营模式一种是“物业经营型”。

原国营大、中商场通过出租场地、摊派营业员等方式本质上已成为各家电生产厂家的“柜台”。

显然,这些商场获得利润的主要来源不再是其经营的“家电产品”。

其作为商业渠道的职能已基本消失,取而代之的是基本的“物业管理”职能。

另一种是“专业经营型”。

以国美、国鼎等为代表的家电连锁专营店是属于这一类。

它们在长期的市场竞争中,逐步占据了家电营销的主导地位。

实际上,这些民营性质的家电经销商的发展有其必然性。

首先,家电制造商产能增加,规模扩大,客观上要求有相应的分销力量来实现其销售;其次,传统百货业放弃了这一职能,给了民营企业可乘之机。

还有一种是“综合型”。

可以预见,随着国家社会经济的发展,在WTO的框架下,将会有更多的国外经销商加入我国的家电营销活动,他们带来的不光是足够多的资金,更重要的是他们会带来更多的先进经营理念,在它们“本土化”的过程中,会显现出“综合型”的特点。

它们表现出来的良好的综合素质和巨大的竞争力,应引起业内人足够的重视。

(二)呈现扁平化特征越来越多的家电制造厂商为获得终端竞争优势而直接介入终端市场,使得分销渠道呈现扁平化的特征。

表现为:家电制造商不再将网络拓展、终端零售的职能完全交给经销商。

有的自建专营店,有的直接深入地级、县级甚至乡镇建设自己的网络终端。

“决胜终端”和“深度分销”成了这一阶段家电企业最热的专有词汇。

目前家电营销渠道存在的主要问题(一)成本高,效率低下中国家电业历来的重大问题之一就是运用渠道的成本居高不下。

渠道成本高主要表现为渠道利润缺失及渠道投入过大。

主要原因有两方面。

一是“卖方市场”时期形成的流通环节过多,销售渠道混杂,且缺乏有效的促销,无形中损失了渠道利润;二是“买方市场”时期形成的厂家直接面对零售终端,所投入的人力成本大大加大的同时,导致了渠道运营的效率低下。

(二)营销渠道的目标市场趋同化据国务院发展研究中心提供的调研数据显示,目前我国城市居民家庭洗衣机和电冰箱的饱和度已经分别达到了92.1%和90.4%;而在农村,洗衣机的拥有率仅为32%,电冰箱的拥有率还不到20%,由此可见,我国家电市场呈现出城乡巨大反差的“二元结构”格局。

尽管如此,众多的家电行业还是以城市为中心战场,苦战鏖战。

原因很简单,因为长期以来,中国的经济是以城市为中心,工商企业销售的主要目标市场及服务中心也在城市。

随着市场经济的发展,城市重大市场竞争越来越激烈,利润空间越来越小,争取一块市场的成本越来越高。

中国家电企业有一种浓浓的城市中心情结,不可避免地使很多企业用在城市里大市场的惯性思维和对农村市场的错误理解指导自己的营销活动。

有人把这称作农村市场的“城市病”。

例如,继“长虹”等一些企业在农村市场失败后,“康佳”又在对国家宏观经济及农村实际情况错误判断的基础上,做出大力开发农村市场的决策,将投入1.5亿元,建设乡镇营销网络体系,网络甚至铺到了县里的小镇上。

然而,农村的实际情况是,尽管农村进出设施及电网改造等方面虽有所改变,但农民的实际可支配收入却并没有得到大幅度改善,因而对这些便宜果实的存货并未表现出多大热情,只是原来斥巨资铺设的销售渠道变得效益低下,大多的投入无法形成回报。

(三)家电营销渠道的竞争更加激烈如今的家电营销渠道可谓是硝烟四起。

以国美等为首的家电连锁经营模式以后来居上的姿态给大商场、批发市场、以及家电专卖店等传统家电营销渠道带来了前所未有的打击。

随着这些连锁店在全国范围内的不断扩张,两种营销模式的矛盾进一步激化,很多地区甚至从表面的价格竞争演变成暗地里诽谤要挟。

于是各种规范的、不规范的操作一时间在家电流通领域此起彼伏,真可谓“你方唱罢我登场”。

其中最典型、最惹眼的莫过于国美的经历了。

近年来,国美的“圈地运动”发展神速短短几年已经从北京迅速扩张到天津、河北、河南、四川等地。

然而,国美的每一次扩张都伴随着当地商业龙头们的强烈抵制。

以国美在沈阳的遭遇为例,据报道,自国美在沈阳第一家店就遭到了来自沈阳商业几大巨头的强烈抵制,为了“不让规范的市场被国美一夜之间破坏”,他们号称要拿出100万和国美拼到底,并在国美开业当天指派“顾客”前去捣乱致使国美当天的营业不能正常进行,他们甚至还联合起来威胁供货厂家给国美断货,国美则以全国停售反威胁等手段给予回击。

国美的遭遇已经代表了一种普遍的现象,这些“专业经营型”公司向外省市场扩张时,这种阻力就更加明显。

各种营销渠道之间的竞争和矛盾已经到了白热化的地步。

(四)营销渠道国际化我国2001年12月加入WTO,标志着我国经济正式迈入了经济全球化轨道,也标志着我国的营销渠道的国际化。

事实上,正是这种营销渠道的国际化加速了国内家电营销渠道原有矛盾的发展,另一方面也带来了新的机遇。

面对国际国内双重竞争,我国的营销渠道“国际化”已成为必然的选择。

导致以上问题的主要因素市场经济的基本特征之一就是竞争。

笔者认为,我国营销渠道“国际化”是我国社会主义市场经济发展的必然结果。

笔者要强调的是,这些问题看上去都很严重(起码对企业是很严重的),但究其本质来看,它们是市场经济发展中的一点波澜。

问题的实质集中表现在三个方面:(一)原有的市场体制较为落后,新的市场机制尚需完善建立完善的社会主义市场经济体制是实现经济发展战略目标的体制保证,也是全面建设小康社会所要达到的重要目标。

经济体制改革是制度文明建设的重要组成部分,也是整个制度文明建设的基础。

现在,旧体制的弊端尚未完全清除,新体制的矛盾已经日渐清晰地显露出来。

十年来经济体制改革的理论和实践都有重大进展。

多种经济成份共同发展的局面超出原先的预期。

作为所有制变革的直接产物,各种生产要素参与分配格局的形成,以及市场机制作用的日趋普遍化,都是过去所不能想象的。

对外经济体制因为加入WTO的推动而取得可观的进步。

这是经济快速发展和活力增加的重要动因。

但是,总的来说,我国初步建立的社会主义市场经济体制仍然很不完善,改革进程也有不尽如人意的方面。

(二)渠道创新不足创新是个动态的概念,对于昨天的创新,如果今天不继续改进,就不叫创新了,如果今天改进得不充分,就叫创新不足。

从近年的实际情况变化可以看出,我国家电营销渠道确实有一定程度的改进。

例如:随着卖方市场向买方市场的转型,国有商业的僵化体制和闭塞的信息渠道使得大商场的家电经营一下子从暴利时代跌至微利乃至亏损的深渊。

商场便想出了引厂进店,就是把厂家引进店中自主经营,盈亏自负,商家只收取管理费,又称为“店中店”、“品牌店”。

相关文档
最新文档