我用下面的语句时老是说我要访问的path路径被拒绝,ASP.NET 未被授权访问所请求的资源。不明白...
file = "...";
path="...";
WebClient myWebClient = new WebClient();
myWebClient.UploadFile(path,file);但我用下面的
path="...";
Directory.CreateDirectory(path);
这句是可以建立目录的,证明我是有权限访问和写的
是什么原因呢?请各位给出正确的源码,谢谢!
file = "...";
path="...";
WebClient myWebClient = new WebClient();
myWebClient.UploadFile(path,file);但我用下面的
path="...";
Directory.CreateDirectory(path);
这句是可以建立目录的,证明我是有权限访问和写的
是什么原因呢?请各位给出正确的源码,谢谢!
是在本地执行的,就是说是用你当前登录windows的用户建立的
WebClient myWebClient = new WebClient();
是远程执行的,就是用asp.net的用户访问的,你的路径设置为asp.net full control看看
<form id="WebForm3" method="post" encType="multipart/form-data" runat="server" >二. 判断是否有文件上传了:
当用户没有选择任何要上传的文件,即HtmlInputFile控件中的文本框为空时点击了上传按钮后,在服务端得到的File1.PostedFile对象不是null,而是有对象的,所以不能用(File1.PostedFile == null)来判断是否上传了文件,用(File1.PostedFile.ContentLength != 0)来判断比较好三. 判断上传文件MIMIE类型:
文件上传后可以用File1.PostedFile.ContentType来读取这个文件的MIMIE类型,这个MIMIE类型是系统通过上传文件的后缀名来获得的。四. 保存上传的文件:1. 文件可以通过File1.PostedFile.SaveAs(path) //path是服务器上的物理路径,来保存文件。if(File1.PostedFile.ContentLength != 0){StringBuilder myStr = new StringBuilder();myStr.Append("文件名称:" + File1.PostedFile.FileName);myStr.Append("<br>");myStr.Append("文件类型:" + File1.PostedFile.ContentType);myStr.Append("<br>");myStr.Append("文件长度:" + File1.PostedFile.ContentLength.ToString());myStr.Append("<br>"); string path = Server.MapPath("./"); //当前路径string fileName = File1.PostedFile.FileName.Substring(File1.PostedFile.FileName.LastIndexOf('\\')+1);path += fileName;if(File.Exists(path) == true){Label1.Text = "服务器上已经有了你正在上传的文件:" + fileName;return;}File1.PostedFile.SaveAs(path); myStr.Append("保存完毕!");myStr.Append("<br>");Label1.Text = myStr.ToString();}else{Label1.Text = "你没有选择要上载的文件或者上传的文件长度为0!";}
2. 文件也可以通过二进制的读取后存放到数据库的二进制的字段中:
byte[] fileCont = new byte[File1.PostedFile.ContentLength];
File1.PostedFile.InputStream.Read(fileCont,0, File1.PostedFile.ContentLength);
然后将此字节数组fileCont赋给数据库的二进制字段的参数,写到数据库中。 文件下载一. 服务端通过Response输出相应的HTTP Response Headers信息,和要下载的文件的数据来把文件发送到客户端,HTTP Response Headers表现在html文件中是下面的形式:
<meta http-equiv="Content-Type" content="text/htm ">
http-equiv表示是Headers的名称,content表示这个Headers的值二. 首先,要输出文件的MIME类型:
Page.Response.AddHeader( "Content-Type", “MIME类型” );三. 其次,要输出下载的文件的打开位置和文件名:
Page.Response.AddHeader("Content-Disposition", "attachment;filename=" + FileName );
content-disposition 的 HTTP response header 允许指定文档表示的信息。使用这种 header ,你就可以将文档指定成单独打开(而不是在浏览器中打开),还可以根据用户的操作来显示。如果用户要保存文档,你还可以为该文档建议一个文件名。这个建议名称会出现在 Save As 对话框的“文件名”栏中。
attachment ―― 表示作为附件发送到客户端,客户端将单独打开此文件。
inline ―― 表示将在浏览器中打开这个文件。
filename ―― 表示发送到客户端文件的文件名。四. 准备发送到客户端的文件数据:
不管什么类型的文件都要先转成byte类型的数组,然后将这个byte数组用Response.BinaryWrite方法输出到客户端。1. 读取文件来获得byte数组: string FileName; //生成或获取要发送到客户端的文件名string filePath = Server.MapPath("./") + FileName; //假设文件在当前目录下if(File.Exists(filePath) == false){//服务器上没有这个文件return;}FileStream myFile = File.OpenRead(filePath); //读取文件进入FileStreambyte[] fileCont = new byte[myFile.Length];myFile.Read(fileCont,0,(int)myFile.Length); //将文件流中的内容转成byte数组
2. 在数据库的二进制字段中读取: //从url获取图片的idstring ImageId = Request.QueryString["img"];//构建查询语句string sqlText = "SELECT img_data, img_contenttype FROM Image WHERE img_pk = " + ImageId;SqlConnection connection = new SqlConnection( ConfigurationSettings.AppSettings["DSN"].ToString() );SqlCommand command = new SqlCommand( sqlText, connection);connection.Open();SqlDataReader dr = command.ExecuteReader();if ( dr.Read()){byte[] fileCont = (byte[]) dr["img_data"] ;}connection.Close();
通过上述两种方法获得的文件内容的byte数组就可以用来输出了:
Page.Response.BinaryWrite(fileCont);Page.Response.End();
转贴:chi0591 日期:2003-08-29 人气:93
namespace Wmj
{
public class MyUpload
{
private System.Web.HttpPostedFile postedFile=null;
private string savePath="";
private string extension="";
private int fileLength=0;
//显示该组件使用的参数信息
public string Help
{
get{
string helpstring;
helpstring="<font size=3>MyUpload myUpload=new MyUpload(); //构造函数";
helpstring+="myUpload.PostedFile=file1.PostedFile;//设置要上传的文件";
helpstring+="myUpload.SavePath=\"e:\\\";//设置要上传到服务器的路径,默认c:\\";
helpstring+="myUpload.FileLength=100; //设置上传文件的最大长度,单位k,默认1k";
helpstring+="myUpload.Extension=\"doc\";设置上传文件的扩展名,默认txt";
helpstring+="label1.Text=myUpload.Upload();//开始上传,并显示上传结果</font>";
helpstring+="<font size=3 color=red>Design By WengMingJun 2001-12-12 All Right Reserved!</font>";
return helpstring;
}
} public System.Web.HttpPostedFile PostedFile
{
get
{
return postedFile;
}
set
{
postedFile=value;
}
} public string SavePath
{
get
{
if(savePath!="") return savePath;
return "c:\\";
}
set
{
savePath=value;
}
} public int FileLength
{
get
{
if(fileLength!=0) return fileLength;
return 1024;
}
set
{
fileLength=value*1024;
}
} public string Extension
{
get
{
if(extension!="") return extension;
return "txt";
}
set
{
extension=value;
}
} public string PathToName(string path)
{
int pos=path.LastIndexOf("\\");
return path.Substring(pos+1);
} public string Upload()
{
if(PostedFile!=null)
{
try{
string fileName=PathToName(PostedFile.FileName);
if(!fileName.EndsWith(Extension)) return "You must select "+Extension+" file!";
if(PostedFile.ContentLength>FileLength) return "File too big!";
PostedFile.SaveAs(SavePath+fileName);
return "Upload File Successfully!";
}
catch(System.Exception exc)
{return exc.Message;}
}
return "Please select a file to upload!";
}
}
} 用csc /target:Library Wmj.cs 编译成dll供以后多次调用
调用举例
<%@page language="C#" runat="server"%>
<%@import namespace="Wmj"%>
<script language="C#" runat="server">
void Upload(object sender,EventArgs e)
{
MyUpload myUpload=new MyUpload();
// label1.Text=myUpload.Help;
myUpload.PostedFile=file1.PostedFile;
myUpload.SavePath="e:\\";
myUpload.FileLength=100;
label1.Text=myUpload.Upload();
}
</script>
<form enctype="multipart/form-data" runat="server">
<input type="file" id="file1" runat="server"/>
<asp:Button id="button1" Text="Upload" OnClick="Upload" runat="server"/>
<asp:Label id="label1" runat="server"/>
</form>
结论:asp.net的组件支持功能很强 我们如果充分利用可以很容易的编写出非常方便的组件可以大大的方便我们的工作
是不是WebClient不适用于WEB的上传文件呢?