mono -圖片處理


這篇文章中您將了解到以下內容

保存Bitmap

WebClient文件上傳

向服務端傳遞數據

保存Bitmap

做移動端開發,圖片上傳下載是最普通的需求了。

在mono for android中按照資料,下載網絡圖片的功能需要用流對象把圖像轉化為Bitmap,之后再保存,剛開始我是這么做的,看如下代碼:filepath是網絡圖片url

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類還可以利用相關的委托方法,來構建進度條。

文件上傳

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文件夾內。當然了,相關的寫入和訪問權限,我全部賦予。

錯誤緊接着出現了:

1 遠程服務器返回錯誤: (405) 不允許的方法

是不是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協議的具體使用。 文章中的觀點如有不妥的地方,希望大家留言討論。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM