这篇文章中您将了解到如下内容android
作移动端开发,图片上传下载是最普通的需求了。web
在mono for android中按照资料,下载网络图片的功能须要用流对象把图像转化为Bitmap,以后再保存,刚开始我是这么作的,看以下代码:filepath是网络图片urlapi
URL url = new URL(filePath);
HttpURLConnection conn = (HttpURLConnection)url.OpenConnection();
Stream stream = conn.InputStream;
Bitmap bmp = BitmapFactory.DecodeStream(stream);
imageView.SetImageBitmap(bmp);
压缩图片
bm.Compress(Bitmap.CompressFormat.Jpeg, 100,stream);
或者相似的方法
fileName 是文件保存路径
FileStream fs = new FileStream(fileName, FileMode.Create, FileAccess.Write,FileShare.Read);
System.IO.BufferedStream buf = new System.IO.BufferedStream(fs);
压缩图片
bm.Compress(Bitmap.CompressFormat.Jpeg, 100,stream);
buf.Close();
很悲惨,以上的方法行不通安全
换一种解决方法,想到了另外一个类,WebClient,提供上传下载的公开方法,服务器
并且webclient类还能够利用相关的委托方法,来构建进度条。网络
文件上传less
string filePath = @"E:map.jpg";
WebClient webClient = new WebClient();
Uri uri = new Uri("http://my.com/upload");
webClient.Credentials = CredentialCache.DefaultCredentials;
byte[] datas = webClient.UploadFile(uri, "put", filePath); ;
string response = System.Text.Encoding.UTF8.GetString(datas);
我原来的理解,按照上边的代码能够直接把文件存储到特定服务端网站my.com下的upload文件夹内。固然了,相关的写入和访问权限,我所有赋予。post
错误紧接着出现了:网站
1 远程服务器返回错误: (405) 不容许的方法url
是否是put方法指定的问题,大多数状况下请求模块谓词中不包含put方法。我开启服务端的put请求
主要涉及到 处理映射程序的 ExtensionlessUrlHandler-Integrated-4.0 模块,以下图所示
修改后没有效果
那我把put方法改为post?
错误依然存在。
2 网上有资料说,要开启WebDav服务。WebDav服务,也是个安全隐患设置,只要已开启,相关的权限设置就要一一处理。
开启webdav
结果 对于上传文件,一点帮助也没有
最终找了好多资料以后,我仍是坚决了webclient也须要服务端接受程序的思路
string filePath = @"E:map.jpg";
WebClient webClient = new WebClient();
Uri uri = new Uri("http://my.com/file/upload");
webClient.Credentials = CredentialCache.DefaultCredentials;
webClient.UploadFileAsync(uri, "post", filePath);
以上代码中的 http://my.com/file/upload 是一个服务端接口处理程序,而不是一个特定的文件夹。这样不只能够上传文件,还能够按照特定的逻辑处理文件存放的具体位置。
接下来咱们看服务端
对于文件的接受,只须要如下一句核心代码
HttpPostedFileBase file = Request.Files["file"];
同时是否是能够经过如下几种方式向服务端传递数据?
NameValueCollection collection = Request.Form;
NameValueCollection collection = Request.QueryString;
NameValueCollection collection = Request.Headers;
NameValueCollection collection = Request.Files;
Request.Form不起做用
虽然是post提交,Request.Form 却没有任何数据,按照我以上的代码,想从客户端向服务端post提交数据,也无从作起。
虽然post不行,可是能够采起 Request.QueryString的方式,服务端按照get请求直接接收userid便可。以下代码:
string filePath = @"E:map.jpg";
WebClient webClient = new WebClient();
Uri uri = new Uri("http://my.com/file/upload?userid=808");
webClient.Credentials = CredentialCache.DefaultCredentials;
webClient.UploadFileAsync(uri, "post", filePath);
或者接收Headers集合
webClient.Headers.Add("userid", "808");
总之,处理图片的逻辑,无论移动端仍是普通的web端开发,整体的套路都大体同样。服务端api的使用增长了程序的灵活性, 客户端与服务端传值其实是http协议的具体使用。 文章中的观点若有不妥的地方,但愿你们留言讨论。