WPF中利用WebClient向服务器上传文件

转载:原文地址http://blog.csdn.net/wj1589300/article/details/9255631

WPF中利用WebClient向服务器上传文件

忽然接到一个任务,在WPF中上传文件至服务器~在网上搜了很多种方法,最终决定利用WebCient实现文件的上传工作,看似很简单的任务,却遇到了很多问题。先说一下我的探索步骤吧~

一、选用WebClient.UploadFile方法 (String,String, String)

[csharp] view plaincopyprint?

  1. public bool UploadFile(string newfilename)
  2. {
  3. WebClient myWebClient = new WebClient();
  4. myWebClient.Credentials = CredentialCache.DefaultCredentials;
  5. try
  6. {
  7. //将D盘名字为hello的文档,上传到服务器中WPF的文件夹中,并以newfilename命名(newfilename含扩展名)
  8. myWebClient.UploadFile(new Uri("http://localhost:9935/WPF/" + newfilename) , "PUT", @"D\hello.docx");
  9. }
  10. catch (Exception ex)
  11. {
  12. MessageBox.Show("文件上传失败,请稍后重试!");
  13. }
  14. return true;
  15. }
public bool UploadFile(string newfilename)
          {
             WebClient myWebClient = new WebClient();
              myWebClient.Credentials = CredentialCache.DefaultCredentials;
              try
              {
                //将D盘名字为hello的文档,上传到服务器中WPF的文件夹中,并以newfilename命名(newfilename含扩展名)
                  myWebClient.UploadFile(new Uri("http://localhost:9935/WPF/" + newfilename) , "PUT", @"D\hello.docx");
              }
              catch (Exception ex)
              {
                  MessageBox.Show("文件上传失败,请稍后重试!");

              }
              return true;
          }

这种方法遇到了“远程服务器返回错误: (404) 未找到”问题。在网上找解决办法,把所有可能的设置都进行配置,例如(1)IIS上传目录的权限问题(加入Everyone)角色,使之可写入~(2)添加IIS的处理程序映射。首先打开IIS,左侧选择虚拟目录,右侧选择功能视图——处理程序映射——双击进入,选择ExtensionlessHandler-Integrated-4.0双击后,点击请求限制,谓词面板,下列谓词之一中添加上PUT,DELETE.但依旧走不通,奇怪的是,WebClient的下载方法以这种方式却能实现~现在依旧百思不解...

..二、WebClient UploadFile方法 (Url, String)

选用这个重载方法,第一参数是服务器上的一个网页(aspx或者ashx),第二个参数是文件在本地的地址(也是上文的"D\hello.docx")首先要在服务器端生成一个网页,该网页用来处理上传文件存放服务器请求,网页后台的具体代码如下:

[csharp] view plaincopyprint?

  1. protected void Page_Load(object sender, EventArgs e)
  2. {
  3. foreach (string f in Request.Files.AllKeys)
  4. {    //在客户端传入新的文件
  5. HttpPostedFile file = Request.Files[f];
  6. //在客户端传入一个新的文件名
  7. string filename = Request.QueryString["n"];
  8. file.SaveAs(Server.MapPath("../DOC/" + filename + file.FileName.Substring(file.FileName.IndexOf("."))));
  9. }
  10. }
protected void Page_Load(object sender, EventArgs e)
        {
            foreach (string f in Request.Files.AllKeys)
            {    //在客户端传入新的文件
                HttpPostedFile file = Request.Files[f];
                //在客户端传入一个新的文件名
                string filename = Request.QueryString["n"];
                file.SaveAs(Server.MapPath("../DOC/" + filename + file.FileName.Substring(file.FileName.IndexOf("."))));
            }
        }

在客户端需要调用WebClient的UploadFile方法,具体代码如下:

[csharp] view plaincopyprint?

  1. public bool Upload(string filename)
  2. {
  3. WebClient myWebClient = new WebClient();
  4. myWebClient.Credentials = CredentialCache.DefaultCredentials; //获取或设置发送到主机并用于请求进行身份验证的网络凭据
  5. myWebClient.UploadFileAsync(new Uri("http://localhost:9935/WPF/UploadFile.aspx?n="+filename),@ "D:\hello.docx");
  6. myWebClient.UploadFileCompleted += new UploadFileCompletedEventHandler(myWebClient_UploadFileCompleted);
  7. return true;
  8. }
  9. private void myWebClient_UploadFileCompleted(object sender, UploadFileCompletedEventArgs e)
  10. {
  11. if (e.Error != null)
  12. {
  13. MessageBox.Show("上传失败:" + e.Error.Message);
  14. }
  15. else {
  16. MessageBox.Show("上传成功!");
  17. }
  18. }
   public bool Upload(string filename)
          {
              WebClient myWebClient = new WebClient();
              myWebClient.Credentials = CredentialCache.DefaultCredentials; //获取或设置发送到主机并用于请求进行身份验证的网络凭据
              myWebClient.UploadFileAsync(new Uri("http://localhost:9935/WPF/UploadFile.aspx?n="+filename),@ "D:\hello.docx");
              myWebClient.UploadFileCompleted += new UploadFileCompletedEventHandler(myWebClient_UploadFileCompleted);

              return true;
          }

          private void myWebClient_UploadFileCompleted(object sender, UploadFileCompletedEventArgs e)
          {
              if (e.Error != null)
              {
                  MessageBox.Show("上传失败:" + e.Error.Message);
              }
              else {
                  MessageBox.Show("上传成功!");
              }
          }

在此期间也出现了一个错误,耽搁了不少时间,远程服务器返回错误:(500)内部服务器错误。这个问题出现原因一般是在服务器生成的网页中,将运行地址改为本地加断点调试,最后是存放路径出问题了,修改,运行,文件成功上传。~第一次写博客,格式没整好,还望大家多包涵~

WPF中利用WebClient向服务器上传文件

时间: 2024-08-02 06:57:39

WPF中利用WebClient向服务器上传文件的相关文章

Android中利用HTTP协议实现上传文件到服务器

首先我们需要使用HTTP协议发送数据,我们就要知道HTTP发送上传文件到服务器的时候需要哪些头字段已经相关的配置,请看下图 这是使用浏览器模拟上传文件到服务器时候所发送的请求,我们可以看到它包含了请求头字段和实体部分,但是多了一个---------------------------7da2137580612,它实际上是一条分隔线,用于分隔实体数据的,他在使用分隔实体数据的时候会在前面包含多两个"-"而在结束的时候会在除了在前面都出两个减号"-"之外,还会在末尾都出

在MVC中利用uploadify插件实现上传文件的功能

趁着近段的空闲时间,开发任务不是很重,就一直想把以前在仓促时间里所写的多文件上传功能改一下,在网上找了很多例子,觉得uploadify还可以,就想用它来试试.实现自己想要的功能.根据官网的开发文档,同时借鉴别人的经验,经过断断续续的修改(中间一直被安排其它事),把uploadify默认的样式改,同时把共性都封装了一下,最终完工了. 1.在_Layout.cshtml 页面中引入js文件和CSS文件: 1 @*-------上传文件--------*@ 2 <link href="@Url.

不使用ASP.NET中的服务器控件将如何上传文件?

遇到文件的上传时,可能会有大部分的开发者喜欢使用服务器控件,虽然很方便,但是却不能很好的控制,不具灵活性. 现给出例子,使用html标签语言灵活的控制文件的上传. 1.html部分 <input type="file" id="uploadFile" name="uploadFile" style="display: none;"/> <a href="#" id="upload

跨服务器上传文件方式

跨服务器上传文件的方式有很多,其中一种是使用在中间服务器上使用临时文件的方式进行保存后再发送到另一个服务器上,实现文件上传. 问题点:中间保存临时文件,还需要不定时的进行文件清理,比较麻烦 直接进行文件的转发,使用byte[]数组方式直接进行文件转发,然后,服务器根据传递的byte[]数组进行转文件方式,使用httpclient方式将byte[]数组发送到服务端,特别注意的点在于, 发送的时候使用"content-type" = "application/json"

利用iframe无刷新上传文件的坑

原文:利用iframe无刷新上传文件的坑 页面里经常要用到文件上传的功能,而且要求页面不刷新,先说一下原理:页面里放一个file控件和submit按钮,外面用form表单包住,给form表单加上对应的属性值,action.method.entype.name,到这一步,能上传文件了,但是这样上传文件会刷新页面,这不是我们想要的.我们要的是文件上传时不刷新页面,那么也简单,在页面里放一个iframe,设置它的宽高为0,这里有两个坑: 1.需要设置iframe的name值与form的target属性

web服务器上传文件过程

通过web服务器上传文件,需要提前准备好下面3步,然后才能通过第4步上传文件1.web服务器的配置 1.1 将代码src目录中的select.c文件的170行的REQUEST_TIMEOUT改为10*REQUEST_TIMEOUT 1.2 在buildroot中选中boa后保存编译,然后更新nfs_root中内容: 1.3 重启单板 1.4 配置/etc/boa/boa.conf文件 1.4.1 屏蔽掉Group nobody,增加Group 0 1.4.2 去掉Errorlog前的屏蔽 1.4

idea 内置tomcat jersey 跨服务器 上传文件报400错误

报错内容 com.sun.jersey.api.client.UniformInterfaceException: PUT http://.jpg returned a response status of 400 Bad Request 因为跨服务器上传文件,文件名中里面含有中文名称,所以报错,解决: 让文件服务器支持utf-8编码或者将文件名变成英文.(最好的就是根据时间加随机数 或者是UUID来命名) 简单版的jsersey上传 @RequestMapping("/fileupload3&

WebClient和HttpWebRequest 上传文件

这几天对接淘宝的上传航司政策的接口.对期间出现的问题,以及使用WebClient和HttpWebReques 上传文件进行总结.本文重要信息已使用'*'代替 1.WebClient上传文件 使用UploadFile上传文件,其中fileNamePath为物理路径. public bool UpLoadFile(string fileNamePath,string url) { string timeStamp = DateTime.Now.ToString("YYYY-MM-DD HH:mm:s

ueditor1.3.6jsp版在struts2应用中上传图片报&quot;未找到上传文件&quot;解决方案

摘要: ueditor1.3.6jsp版在struts2应用中上传图片报"未找到上传文件"解决方案 在struts2应用中使用ueditor富文本编辑器上传图片或者附件时,即使配置好了上传路径信息,也会出现"未找到上传文件"的错误提示,出先该问题的原因是:在配置struts过滤器,过滤路径设置/*方式时,由于struts2框架默认使用apache的Commons FileUpload组件和内建的FileUploadInterceptor拦截器实现上传,会将reque