mono -圖片處理

這篇文章中您將瞭解到如下內容android

保存Bitmap

WebClient文件上傳

向服務端傳遞數據

保存Bitmap

作移動端開發,圖片上傳下載是最普通的需求了。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,提供上傳下載的公開方法,服務器

並且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協議的具體使用。 文章中的觀點若有不妥的地方,但願你們留言討論。

相關文章
相關標籤/搜索