用winform 怎么能在远程服务器中创建文件夹

chengxuyuan1989 2010-11-24 11:30:06
在客户端上控制服务器端创建文件夹,并把word文档上传到此文件夹下,应该怎么实现这个功能 ,(现在急用,)请高手帮忙解决,万分感谢!(最好能给出代码)
...全文
1006 59 打赏 收藏 转发到动态 举报
写回复
用AI写文章
59 条回复
切换为时间正序
请发表友善的回复…
发表回复
老虎打 2013-01-17
  • 打赏
  • 举报
回复
引用 5 楼 hch126163 的回复:
在WinForm里面调用下面的方法来上传文件:

// <summary>
/// 将本地文件上传到指定的服务器(HttpWebRequest方法)
/// </summary>
/// <param name="address">文件上传到的服务器</param>
/// <param name="fileNam……


报错了~~


Length = “s.Length”引发了“System.NotSupportedException”类型的异常
hch126163 2010-11-24
  • 打赏
  • 举报
回复

在WinForm里面调用下面的方法来上传文件:

// <summary>
/// 将本地文件上传到指定的服务器(HttpWebRequest方法)
/// </summary>
/// <param name="address">文件上传到的服务器</param>
/// <param name="fileNamePath">要上传的本地文件(全路径)</param>
/// <param name="saveName">文件上传后的名称</param>
/// <param name="progressBar">上传进度条</param>
/// <returns>成功返回1,失败返回0</returns>
private int Upload_Request(string address, string fileNamePath, string saveName, ProgressBar progressBar)
{
int returnValue = 0;

// 要上传的文件
FileStream fs = new FileStream(fileNamePath, FileMode.Open, FileAccess.Read);
BinaryReader r = new BinaryReader(fs);
//时间戳
string strBoundary = "----------" + DateTime.Now.Ticks.ToString("x");
byte[] boundaryBytes = Encoding.ASCII.GetBytes("\r\n--" + strBoundary + "\r\n");
//请求头部信息
StringBuilder sb = new StringBuilder();
sb.Append("--");
sb.Append(strBoundary);
sb.Append("\r\n");
sb.Append("Content-Disposition: form-data; name=\"");
sb.Append("file");
sb.Append("\"; filename=\"");
sb.Append(saveName);
sb.Append("\"");
sb.Append("\r\n");
sb.Append("Content-Type: ");
sb.Append("application/octet-stream");
sb.Append("\r\n");
sb.Append("\r\n");
string strPostHeader = sb.ToString();
byte[] postHeaderBytes = Encoding.UTF8.GetBytes(strPostHeader);

// 根据uri创建HttpWebRequest对象
HttpWebRequest httpReq = (HttpWebRequest)WebRequest.Create(new Uri(address));
httpReq.Method = "POST";
//对发送的数据不使用缓存
httpReq.AllowWriteStreamBuffering = false;
//设置获得响应的超时时间(300秒)
httpReq.Timeout = 300000;
httpReq.ContentType = "multipart/form-data; boundary=" + strBoundary;
long length = fs.Length + postHeaderBytes.Length + boundaryBytes.Length;
long fileLength = fs.Length;
httpReq.ContentLength = length;
try
{
progressBar.Maximum = int.MaxValue;
progressBar.Minimum = 0;
progressBar.Value = 0;

//每次上传4k
int bufferLength = 4096;
byte[] buffer = new byte[bufferLength];
//已上传的字节数
long offset = 0;
//开始上传时间
DateTime startTime = DateTime.Now;
int size = r.Read(buffer, 0, bufferLength);
Stream postStream = httpReq.GetRequestStream();
//发送请求头部消息
postStream.Write(postHeaderBytes, 0, postHeaderBytes.Length);
while (size > 0)
{
postStream.Write(buffer, 0, size);
offset += size;
progressBar.Value = (int)(offset * (int.MaxValue / length));
TimeSpan span = DateTime.Now - startTime;
double second = span.TotalSeconds;
lblTime.Text = "已用时:" + second.ToString("F2") + "秒";
if (second > 0.001)
{
lblSpeed.Text = " 平均速度:" + (offset / 1024 / second).ToString("0.00") + "KB/秒";
}
else
{
lblSpeed.Text = " 正在连接…";
}
lblState.Text = "已上传:" + (offset * 100.0 / length).ToString("F2") + "%";
lblSize.Text = (offset / 1048576.0).ToString("F2") + "M/" + (fileLength / 1048576.0).ToString("F2") + "M";
Application.DoEvents();
size = r.Read(buffer, 0, bufferLength);
}
//添加尾部的时间戳
postStream.Write(boundaryBytes, 0, boundaryBytes.Length);
postStream.Close();
//获取服务器端的响应
WebResponse webRespon = httpReq.GetResponse();
Stream s = webRespon.GetResponseStream();
StreamReader sr = new StreamReader(s);

//读取服务器端返回的消息
String sReturnString = sr.ReadLine();
s.Close();
sr.Close();
if (sReturnString == "Success")
{
returnValue = 1;
}
else if (sReturnString == "Error")
{
returnValue = 0;
}

}
catch
{
returnValue = 0;
}
finally
{
fs.Close();
r.Close();
}

return returnValue;
}

参数说明如下:
address:接收文件的URL地址,如:http://localhost/UploadFile/Save.aspx
fileNamePath:要上传的本地文件,如:D:\test.rar
saveName:文件上传到服务器后的名称,如:200901011234.rar
progressBar:显示文件上传进度的进度条
接收文件的WebForm添加一个Save.aspx页面,Load方法如下:
protected void Page_Load(object sender, EventArgs e)
{
if (Request.Files.Count > 0)
{
try
{
HttpPostedFile file = Request.Files[0];
string filePath = this.MapPath("UploadDocument") + "\\" + file.FileName;
file.SaveAs(filePath);
Response.Write("Success\r\n");
}
catch
{
Response.Write("Error\r\n");
}
}

同时需要配置WebConfig文件的httpRuntime 如下:

<httpRuntime maxRequestLength="102400" executionTimeout="300"/>

不能的话最大只能上传4M了。要是想上传更大的文件,maxRequestLength,executionTimeout设置大些,同时WinForm下的代码行

//设置获得响应的超时时间(300秒)
httpReq.Timeout = 300000;

也要修改,另外别忘了看看IIS的连接超时是否设置为足够大。

一切都配置好了,运行效果如下:



为了解决这个问题,我查看了很多文章,记于此,以后遇到同样的问题有个查找的地方。

/// <summary>
/// 将本地文件上传到指定的服务器(HttpWebRequest方法)
/// </summary>
/// <param name="address">文件上传到的服务器</param>
/// <param name="fileNamePath">要上传的本地文件(全路径)</param>
/// <param name="saveName">文件上传后的名称</param>
/// <returns>成功返回1,失败返回0</returns>
private string Upload_Request(string address, string fileNamePath, string saveName)
{

// 要上传的文件
FileStream fs = new FileStream(fileNamePath, FileMode.Open, FileAccess.Read);
BinaryReader r = new BinaryReader(fs);

//时间戳
string strBoundary = "----------" + DateTime.Now.Ticks.ToString("x");
byte[] boundaryBytes = Encoding.ASCII.GetBytes("\r\n--" + strBoundary + "\r\n");

//请求头部信息
StringBuilder sb = new StringBuilder();
sb.Append("--");
sb.Append(strBoundary);
sb.Append("\r\n");
sb.Append("Content-Disposition: form-data; name=\"");
sb.Append("file");
sb.Append("\"; filename=\"");
sb.Append(saveName);
sb.Append("\"");
sb.Append("\r\n");
sb.Append("Content-Type: ");
sb.Append("application/octet-stream");
sb.Append("\r\n");
sb.Append("\r\n");
string strPostHeader = sb.ToString();
byte[] postHeaderBytes = Encoding.UTF8.GetBytes(strPostHeader);

// 根据uri创建HttpWebRequest对象
HttpWebRequest httpReq = (HttpWebRequest)WebRequest.Create(new Uri(address));
httpReq.Method = "POST";

//对发送的数据不使用缓存
httpReq.AllowWriteStreamBuffering = false;

//设置获得响应的超时时间(300秒)
httpReq.Timeout = 300000;
httpReq.ContentType = "multipart/form-data; boundary=" + strBoundary;
long length = fs.Length + postHeaderBytes.Length + boundaryBytes.Length;
long fileLength = fs.Length;
httpReq.ContentLength = length;
try
{


//每次上传4k
int bufferLength = 4096;
byte[] buffer = new byte[bufferLength];

//已上传的字节数
long offset = 0;

//开始上传时间
DateTime startTime = DateTime.Now;
int size = r.Read(buffer, 0, bufferLength);
Stream postStream = httpReq.GetRequestStream();

//发送请求头部消息
postStream.Write(postHeaderBytes, 0, postHeaderBytes.Length);
while (size > 0)
{
postStream.Write(buffer, 0, size);
offset += size;

size = r.Read(buffer, 0, bufferLength);
}
//添加尾部的时间戳
postStream.Write(boundaryBytes, 0, boundaryBytes.Length);
postStream.Close();

//获取服务器端的响应
WebResponse webRespon = httpReq.GetResponse();
Stream s = webRespon.GetResponseStream();
StreamReader sr = new StreamReader(s);

//读取服务器端返回的消息
String sReturnString = sr.ReadLine();
s.Close();
sr.Close();
return sReturnString;

}
catch
{
return "";
}
finally
{
fs.Close();
r.Close();
}
}
chengxuyuan1989 2010-11-24
  • 打赏
  • 举报
回复
hedongde@163.com,发这吧!谢谢
air123456789 2010-11-24
  • 打赏
  • 举报
回复
汗,发错了。 我上传的 还没看到啊。不知道怎么回事 你邮箱拿来 我发给你。
air123456789 2010-11-24
  • 打赏
  • 举报
回复
我有个源码。我上传到CSDN下载 你去下载哈。等待
chengxuyuan1989 2010-11-24
  • 打赏
  • 举报
回复
[Quote=引用 57 楼 zyl_leilei 的回复:]
C# code

//client端
usingSystem;
usingSystem.Text;
usingSystem.IO;
usingSystem.Net;
usingSystem.Net.Sockets;
namespacesocketsample
{
  classClass1
  {
   staticvoidMain()
   {
    try
  ……
[/Quote]

有实例吗,可以给我发过来吗?
-小蕾- 2010-11-24
  • 打赏
  • 举报
回复

//client端
usingSystem;
usingSystem.Text;
usingSystem.IO;
usingSystem.Net;
usingSystem.Net.Sockets;
namespacesocketsample
{
  classClass1
  {
   staticvoidMain()
   {
    try
    {
     intport=2000;
     stringhost="127.0.0.1";
     IPAddressip=IPAddress.Parse(host);
     IPEndPointipe=newIPEndPoint(ip,port);//把ip和端口转化为IPEndPoint实例
     Socketc=newSocket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);//创建一个Socket
     Console.WriteLine("Conneting...");
     c.Connect(ipe);//连接到服务器
     stringsendStr="hello!Thisisasockettest";
     byte[]bs=Encoding.ASCII.GetBytes(sendStr);
     Console.WriteLine("SendMessage");
     c.Send(bs,bs.Length,0);//发送测试信息
     stringrecvStr="";
     byte[]recvBytes=newbyte[1024];
     intbytes;
     bytes=c.Receive(recvBytes,recvBytes.Length,0);//从服务器端接受返回信息
     recvStr+=Encoding.ASCII.GetString(recvBytes,0,bytes);
     Console.WriteLine("ClientGetMessage:{0}",recvStr);//显示服务器返回信息
     c.Close();
    }
    catch(ArgumentNullExceptione)
    {
     Console.WriteLine("ArgumentNullException:{0}",e);
    }
    catch(SocketExceptione)
    {
     Console.WriteLine("SocketException:{0}",e);
    }
    Console.WriteLine("PressEntertoExit");
    Console.ReadLine();
   }
  }
}


//server端
usingSystem;
usingSystem.Text;
usingSystem.IO;
usingSystem.Net;
usingSystem.Net.Sockets;
namespaceProject1
{
  classClass2
  {
   staticvoidMain()
   {
    try
    {
     intport=2000;
     stringhost="127.0.0.1";
     IPAddressip=IPAddress.Parse(host);
     IPEndPointipe=newIPEndPoint(ip,port);
     Sockets=newSocket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);//创建一个Socket类
     s.Bind(ipe);//绑定2000端口
     s.Listen(0);//开始监听
     Console.WriteLine("Waitforconnect");
     Sockettemp=s.Accept();//为新建连接创建新的Socket。
     Console.WriteLine("Getaconnect");
     stringrecvStr="";
     byte[]recvBytes=newbyte[1024];
     intbytes;
     bytes=temp.Receive(recvBytes,recvBytes.Length,0);//从客户端接受信息
     recvStr+=Encoding.ASCII.GetString(recvBytes,0,bytes);
     Console.WriteLine("ServerGetMessage:{0}",recvStr);//把客户端传来的信息显示出来
     stringsendStr="Ok!ClientSendMessageSucessful!";
     byte[]bs=Encoding.ASCII.GetBytes(sendStr);
     temp.Send(bs,bs.Length,0);//返回客户端成功信息
     temp.Close();
     s.Close();
    }
    catch(ArgumentNullExceptione)
    {
     Console.WriteLine("ArgumentNullException:{0}",e);
    }
    catch(SocketExceptione)
    {
     Console.WriteLine("SocketException:{0}",e);
    }
    Console.WriteLine("PressEntertoExit");
    Console.ReadLine();
   }
  }
}

air123456789 2010-11-24
  • 打赏
  • 举报
回复
[Quote=引用 55 楼 chengxuyuan1989 的回复:]

引用 54 楼 air123456789 的回复:
引用 53 楼 chengxuyuan1989 的回复:

引用 52 楼 air123456789 的回复:
郁闷了,为什么我都没遇到这些问题... 我直接运行就成功了。 要不 你在去别的资料载点看看?


你是上传到本机,所以没什么问题,我试了也成功了,就是上传到远程服务器上有问题,应该就是和服务器的连接上有问题,我再去其他地……
[/Quote]

是我自己机子做服务器的时候,别的机子能传过来的。
chengxuyuan1989 2010-11-24
  • 打赏
  • 举报
回复
[Quote=引用 54 楼 air123456789 的回复:]
引用 53 楼 chengxuyuan1989 的回复:

引用 52 楼 air123456789 的回复:
郁闷了,为什么我都没遇到这些问题... 我直接运行就成功了。 要不 你在去别的资料载点看看?


你是上传到本机,所以没什么问题,我试了也成功了,就是上传到远程服务器上有问题,应该就是和服务器的连接上有问题,我再去其他地方看看吧,虽然没解决问题,不过也万分感谢你的帮忙!

……
[/Quote]

你是把文件上传到别的电脑上吗?我怎么总是出问题啊,郁闷^^!
air123456789 2010-11-24
  • 打赏
  • 举报
回复
[Quote=引用 53 楼 chengxuyuan1989 的回复:]

引用 52 楼 air123456789 的回复:
郁闷了,为什么我都没遇到这些问题... 我直接运行就成功了。 要不 你在去别的资料载点看看?


你是上传到本机,所以没什么问题,我试了也成功了,就是上传到远程服务器上有问题,应该就是和服务器的连接上有问题,我再去其他地方看看吧,虽然没解决问题,不过也万分感谢你的帮忙!
[/Quote]



我用相同的方法 用在自己做的程序上,然后在局域网是可以成功的....
chengxuyuan1989 2010-11-24
  • 打赏
  • 举报
回复
[Quote=引用 52 楼 air123456789 的回复:]
郁闷了,为什么我都没遇到这些问题... 我直接运行就成功了。 要不 你在去别的资料载点看看?
[/Quote]

你是上传到本机,所以没什么问题,我试了也成功了,就是上传到远程服务器上有问题,应该就是和服务器的连接上有问题,我再去其他地方看看吧,虽然没解决问题,不过也万分感谢你的帮忙!
air123456789 2010-11-24
  • 打赏
  • 举报
回复
郁闷了,为什么我都没遇到这些问题... 我直接运行就成功了。 要不 你在去别的资料载点看看?
chengxuyuan1989 2010-11-24
  • 打赏
  • 举报
回复
[Quote=引用 48 楼 chengxuyuan1989 的回复:]
引用 47 楼 air123456789 的回复:
引用 46 楼 chengxuyuan1989 的回复:

引用 45 楼 air123456789 的回复:
你设置断点看看咯。


在两台电脑上要怎么设置断点?


不是啊, 服务器那边 不是用VS打开的吧。 就是直接打开的吧? 用VS打开我不知道行不行啊。

客户端 就设置断点 看下为什么会自动关掉咯。

哦,知……
[/Quote]

我设断点试了,又报错了
chengxuyuan1989 2010-11-24
  • 打赏
  • 举报
回复
[Quote=引用 47 楼 air123456789 的回复:]
引用 46 楼 chengxuyuan1989 的回复:

引用 45 楼 air123456789 的回复:
你设置断点看看咯。


在两台电脑上要怎么设置断点?


不是啊, 服务器那边 不是用VS打开的吧。 就是直接打开的吧? 用VS打开我不知道行不行啊。

客户端 就设置断点 看下为什么会自动关掉咯。
[/Quote]
Cobibiyang 2010-11-24
  • 打赏
  • 举报
回复
如果你的框架是三层架构就不存在这样的问题了
chengxuyuan1989 2010-11-24
  • 打赏
  • 举报
回复
[Quote=引用 47 楼 air123456789 的回复:]
引用 46 楼 chengxuyuan1989 的回复:

引用 45 楼 air123456789 的回复:
你设置断点看看咯。


在两台电脑上要怎么设置断点?


不是啊, 服务器那边 不是用VS打开的吧。 就是直接打开的吧? 用VS打开我不知道行不行啊。

客户端 就设置断点 看下为什么会自动关掉咯。
[/Quote]
哦,知道了,我再试试,谢谢啊!
air123456789 2010-11-24
  • 打赏
  • 举报
回复
[Quote=引用 46 楼 chengxuyuan1989 的回复:]

引用 45 楼 air123456789 的回复:
你设置断点看看咯。


在两台电脑上要怎么设置断点?
[/Quote]

不是啊, 服务器那边 不是用VS打开的吧。 就是直接打开的吧? 用VS打开我不知道行不行啊。

客户端 就设置断点 看下为什么会自动关掉咯。
chengxuyuan1989 2010-11-24
  • 打赏
  • 举报
回复
[Quote=引用 45 楼 air123456789 的回复:]
你设置断点看看咯。
[/Quote]

在两台电脑上要怎么设置断点?
air123456789 2010-11-24
  • 打赏
  • 举报
回复
你设置断点看看咯。
加载更多回复(37)

111,129

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧