zoukankan      html  css  js  c++  java
  • 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协议的具体使用。 文章中的观点如有不妥的地方,希望大家留言讨论。

     

  • 相关阅读:
    eclipse中统计代码行数
    vmware ubuntu 最近遇到的一些问题
    Shows how to create and run composites dynamically
    程序员的艺术:排序算法舞蹈
    Apache Mina 网络通信
    OutOfMemoryError汇总
    c++/java/c# 几种编程语言的指针、引用比较
    Silverlight开发工具集合
    web.cong 详解
    ASP.NET中的web.config配置
  • 原文地址:https://www.cnblogs.com/needrunning/p/3497677.html
Copyright © 2011-2022 走看看