在windows phone环境下,将手机上的图片上传到服务端(php环境);

注意事项:在上传的地方,头文件中name,例如name= img,则在php服务端处理时

,需要约定好 存取一致 php:$_FILES['img']['name'],如若两端的name不相同则服务端无法正确获取上传的文件;

public class UploadSrv

 {

     #region 选择图片

 

     /// <summary>

     /// 打开照相机

     /// </summary>

     public void OpenCamera()

     {

         CameraCaptureTask cameraCapture = new CameraCaptureTask();

         cameraCapture.Completed += photoChooser_Completed;

         cameraCapture.Show();

     }

 

     /// <summary>

     /// 选择图片

     /// </summary>

     public void ChooseImage()

     {

         PhotoChooserTask photoChooser = new PhotoChooserTask();

         photoChooser.Completed += photoChooser_Completed;

         photoChooser.Show();

     }

       

     void photoChooser_Completed(object sender, PhotoResult e)

     {

         if (e.TaskResult == TaskResult.OK)

         {

             Upload(e.ChosenPhoto);

             

             //BitmapImage bitmap = new BitmapImage();

             //bitmap.SetSource(e.ChosenPhoto);

             //Image img = new Image();

             //img.Source = bitmap;

 

             //if (e.ChosenPhoto != null)

             //{

             //    Stream s = UploadFile.Compression(e.ChosenPhoto);

             //    bytepic = StreamToBytes(s);

             //    Encoding myEncoding = Encoding.GetEncoding("utf-8");

             //    strpic = Convert.ToBase64String(bytepic);

             //    ExistsPic = true;

             //}

         }

     }

 

     #endregion

 

     /// <summary>

     /// 上传

     /// </summary>

     /// <param name="argStream"></param>

     void Upload(Stream argStream)

     {

         if (!DeviceNetworkInformation.IsNetworkAvailable)

         {

             MessageBox.Show("请开启网络连接..");

             return;

         }

         if (!DeviceNetworkInformation.IsCellularDataEnabled && !DeviceNetworkInformation.IsWiFiEnabled)

         {

             MessageBox.Show("请开启网络连接...");

             return;

         }

 

         byte[] bytes = new byte[argStream.Length];

 

         argStream.Seek(0, SeekOrigin.Begin);

 

         while (argStream.Read(bytes, 0, bytes.Length) > 0) ;

 

         string fileName = Constant.Mac + ".png";//此处指定了上传文件名 ,Constant.Mac是自己定义的常量

 

 

         Dictionary<string, object> postParameters = new Dictionary<string, object>();

         string contentType = "multipart/form-data";//"image/jpeg";//"multipart/form-data";//"application/octetstream";//"image/jpeg";//"multipart/form-data";  

         FileParameter param = new FileParameter(bytes, fileName, contentType);

         postParameters.Add(fileName, param);

 

         HttpMultipartFormRequest req = new HttpMultipartFormRequest();

         req.AsyncHttpRequest(Constant.URL_IMG_UploadPortrait, postParameters, null); //自己定义的常量 Post上传到的网址

          

         //Sys.ProgressBarBase.Show(true);

     }

 

     #region 其他方法(未使用)

 

 

     /// <summary> 

     /// 字节流转换byte 

     /// </summary> 

     /// <param name="stream"></param> 

     /// <returns></returns> 

     byte[] StreamToBytes(Stream stream)

     {

         byte[] bytes = new byte[stream.Length];

         stream.Read(bytes, 0, bytes.Length);

         // 设置当前流的位置为流的开始  

         stream.Seek(0, SeekOrigin.Begin);

         return bytes;

     }

 

     /// <summary> 

     /// 压缩图片,只调整质量,不调整分辨率 

     /// </summary> 

     /// <param name="soucre">图片流</param> 

     /// <param name="quality">质量1-100</param> 

     Stream Compression(Stream soucre, int quality)

     {

         //var quality = 80;

         soucre.Seek(0, SeekOrigin.Begin);

         var p = quality / 100.0;

         var writeableBitmap = PictureDecoder.DecodeJpeg(soucre);

         var width = writeableBitmap.PixelWidth * p;

         var height = writeableBitmap.PixelHeight * p;

         var outstream = new MemoryStream();

         writeableBitmap.SaveJpeg(outstream, (int)width, (int)height, 0, quality);

         outstream.Seek(0, SeekOrigin.Begin);

         return outstream;

     }

 

     /// <summary> 

     /// 根据文件扩展名获取文件类型 

     /// </summary> 

     /// <param name="fileName">文件名</param> 

     /// <returns></returns> 

     string GetContentType(string fileName)

     {

         var fileExt = System.IO.Path.GetExtension(fileName);

         return GetCommonFileContentType(fileExt);

     }

     /// <summary> 

     /// 获取通用文件的文件类型 

     /// </summary> 

     /// <param name="fileExt">文件扩展名.如".jpg",".gif"等</param> 

     /// <returns></returns> 

     string GetCommonFileContentType(string fileExt)

     {

         switch (fileExt)

         {

             case ".jpg":

             case ".jpeg":

                 return "image/jpeg";

             case ".gif":

                 return "image/gif";

             case ".bmp":

                 return "image/bmp";

             case ".png":

                 return "image/png";

             default:

                 return "application/octetstream";

         }

     }

 

     #endregion

 }

以下2个类是实际上传文件处理类:

 

    /// <summary>

    /// 文件类型数据的内容参数

    /// </summary>

    public class FileParameter

    {

        // 文件内容

        public byte[] File { get; set; }

        // 文件名

        public string FileName { get; set; }

        // 文件内容类型

        public string ContentType { get; set; }

 

        public FileParameter(byte[] file) : this(file, null) { }

 

        public FileParameter(byte[] file, string filename) : this(file, filename, null) { }

 

        public FileParameter(byte[] file, string filename, string contentType)

        {

            File = file;

            FileName = filename;

            ContentType = contentType;

        }

    }

 

    /// <summary>

    /// 文件上传类(数据与文件http请求)

    /// </summary>

    public class HttpMultipartFormRequest

    {

        #region Data Members

 

        private readonly Encoding DefaultEncoding = Encoding.UTF8;

        private ResponseCallback m_Callback;

        private byte[] m_FormData;

 

        #endregion

 

        #region Constructor

 

        public HttpMultipartFormRequest()

        {

        }

 

        #endregion

 

        #region Delegate

 

        public delegate void ResponseCallback(string msg);

 

        #endregion

 

        /// <summary>

        /// 传单个文件(暂不用)

        /// </summary>

        /// <param name="postUri"></param>

        /// <param name="argbytes"></param>

        /// <param name="callback"></param>

        public void AsyncHttpRequest(string postUri, byte[] argbytes, ResponseCallback callback = null)

        {

            // 随机序列,用作防止服务器无法识别数据的起始位置

            string formDataBoundary = String.Format("----------{0:N}", Guid.NewGuid());

            // 设置contentType

            string contentType = "multipart/form-data; boundary=" + formDataBoundary;

            // 将数据转换为byte[]格式

            m_FormData = argbytes;//GetMultipartFormData(postParameters, formDataBoundary);

            // 回调函数

            m_Callback = callback;

 

            // 创建http对象

            HttpWebRequest request = HttpWebRequest.CreateHttp(new Uri(postUri));

            // 设为post请求

            request.Method = "POST";

            request.ContentType = contentType;

            // 请求写入数据流

            request.BeginGetRequestStream(GetRequestStreamCallback, request);

        }

 

        /// <summary>

        /// 传多个文件

        /// </summary>

        /// <param name="postUri">请求的URL</param>

        /// <param name="postParameters">[filename,FileParameter]</param>

        /// <param name="callback">回掉函数</param>

        public void AsyncHttpRequest(string postUri, Dictionary<string, object> postParameters, ResponseCallback callback)

        {

            // 随机序列,用作防止服务器无法识别数据的起始位置

            string formDataBoundary = String.Format("----------{0:N}", Guid.NewGuid());

            // 设置contentType

            string contentType = "multipart/form-data; boundary=" + formDataBoundary;

            // 将数据转换为byte[]格式

            m_FormData = GetMultipartFormData(postParameters, formDataBoundary);

            // 回调函数

            m_Callback = callback;

 

            // 创建http对象

            HttpWebRequest request = HttpWebRequest.CreateHttp(new Uri(postUri));

            // 设为post请求

            request.Method = "POST";

            request.ContentType = contentType;

            // 请求写入数据流

            request.BeginGetRequestStream(GetRequestStreamCallback, request);

        }

 

        private void GetRequestStreamCallback(IAsyncResult ar)

        {

            HttpWebRequest request = ar.AsyncState as HttpWebRequest;

            using (var postStream = request.EndGetRequestStream(ar))

            {

                postStream.Write(m_FormData, 0, m_FormData.Length);

                postStream.Close();

            }

            request.BeginGetResponse(GetResponseCallback, request);

        }

 

        private void GetResponseCallback(IAsyncResult ar)

        {

            // 处理Post请求返回的消息

            try

            {

                HttpWebRequest request = ar.AsyncState as HttpWebRequest;

                HttpWebResponse response = request.EndGetResponse(ar) as HttpWebResponse;

 

                using (StreamReader reader = new StreamReader(response.GetResponseStream(), DBCSEncoding.GetDBCSEncoding("gb2312")))

                {

                    string msg = reader.ReadToEnd();

 

                    if (m_Callback != null)

                    {

                        m_Callback(msg);

                    }

                }

            }

            catch (Exception e)

            {

                string a = e.ToString();

                if (m_Callback != null)

                {

                    m_Callback(string.Empty);

                }

            }

        }

 

        private byte[] GetMultipartFormData(Dictionary<string, object> postParameters, string boundary)

        {

            Stream formDataStream = new MemoryStream();

            bool needsCLRF = false;

 

            foreach (var param in postParameters)

            {

                if (needsCLRF)

                {

                    formDataStream.Write(DefaultEncoding.GetBytes("\r\n"), 0, DefaultEncoding.GetByteCount("\r\n"));

                }

                needsCLRF = true;

 

                if (param.Value is FileParameter)

                {

                    FileParameter fileToUpload = (FileParameter)param.Value;

 

                    string header = string.Format("--{0}\r\nContent-Disposition: form-data; name=\"{1}\"; filename=\"{2}\";\r\nContent-Type: {3}\r\n\r\n",

                        boundary,

                      "img", // param.Key, //此处如果是请求的php,则需要约定好 存取一致 php:$_FILES['img']['name']

                        fileToUpload.FileName ?? param.Key,

                        fileToUpload.ContentType ?? "application/octet-stream");

 

                    // 将与文件相关的header数据写到stream中

                    formDataStream.Write(DefaultEncoding.GetBytes(header), 0, DefaultEncoding.GetByteCount(header));

                    // 将文件数据直接写到stream中

                    formDataStream.Write(fileToUpload.File, 0, fileToUpload.File.Length);

                }

                else

                {

                    string postData = string.Format("--{0}\r\nContent-Disposition: form-data; name=\"{1}\"\r\n\r\n{2}",

                        boundary,

                        param.Key,

                        param.Value);

                    formDataStream.Write(DefaultEncoding.GetBytes(postData), 0, DefaultEncoding.GetByteCount(postData));

                }

            }

 

            string tailEnd = "\r\n--" + boundary + "--\r\n";

            formDataStream.Write(DefaultEncoding.GetBytes(tailEnd), 0, DefaultEncoding.GetByteCount(tailEnd));

 

            // 将Stream数据转换为byte[]格式

            formDataStream.Position = 0;

            byte[] formData = new byte[formDataStream.Length];

            formDataStream.Read(formData, 0, formData.Length);

            formDataStream.Close();

 

            return formData;

        }

    }

--------------------------------------------------------------------------------------------

--------------------------------------------------------------------------------------------

--------------------------------------------------------------------------------------------

其他参考资料:

直接运行html,选择上传文件后,点提交,即可上传;

注意:name=“file” id=“file” 要与php服务端的 名字一致;

<html>

<body>

 

<form action="upload_file.php" method="post" enctype="multipart/form-data">

<label for="file">Filename:</label>

<input type="file" name="file" id="file" /> 

<br />

<input type="submit" name="submit" value="Submit" />

</form>

 

</body>

</html>

其他参考代码:

http://314858770.iteye.com/blog/720456
http://stackoverflow.com/questions/10124150/send-file-in-post-request-with-windows-phone-7
http://stackoverflow.com/questions/6977615/to-post-image-file-in-windows-phone-7-application
http://chriskoenig.net/2011/08/19/upload-files-from-windows-phone/

关键词: C#上传文件到php

--------------------------------------------------------------------------------------------

--------------------------------------------------------------------------------------------

--------------------------------------------------------------------------------------------

WP8_(windows phone环境下)上传文件从C#到php接口的更多相关文章

  1. IIS环境下上传文件失败

    跟随学习代码练习 php 上传文件,一开始是点击按钮后没有反应,不知道是否成功,使用 var_dump($_FILES) 查看,发现空空如也.遂百度一下,发现基本代码应如下 <form acti ...

  2. Git在windows下上传文件至github流程

    github是开发者分享的一个平台,这里不多说,想要上传文件至github需要有一个开发者账号,还需要在windows下安装好了git. 做好准备工作之后,接下来操作 一:登录github,创建项目 ...

  3. docker在windows下上传文件到容器

    我的系统是windows10,docker是用DockerToolbox工具安装的,安装完之后会默认挂载Windows的C:/Users目录,在docker里面对应路径是/c/Users,docker ...

  4. .NET环境下上传和下载Word文件

    一.上传Word文档或者其他文档 1.简单地上传文件的web服务方法如下 [WebMethod] public void UploadFile() { using (TransactionScope ...

  5. 使用PuTTY在Windows中向Linux上传文件

    为了防止无良网站的爬虫抓取文章,特此标识,转载请注明文章出处.LaplaceDemon/SJQ. http://www.cnblogs.com/shijiaqi1066/p/3843207.html ...

  6. 【阿里云产品公测】ACE下上传文件永久存储实践

    本帖主要内容: ;$,=VB:'   在阿里云的ACE下,我是如何实现让上传的文件永久保存的? ,%"!8T   本文以PHP为例,具体知识点如下: WD# 96V   第一,扩展服务“存储 ...

  7. Windows服务器修改网站上传文件的大小限制

    ASP程序 方法一: 修改该网站的的最大上传文件的大小限制 在Windows server上会出现上传大小受限制的问题,这是由于windows server的IIS管理器做了限制所致,IIS默认设置是 ...

  8. 不用FTP,直接Windows与Linux下互传文件

    直接上传文件到Linux[1] Linux上输入命令:rz 直接下载Linux中的文件[2] 使用命令: sz 文件名 网上看到这个帖子,觉得很实用,转载保存 下载一个部署文件夹,到本地电脑 . 两步 ...

  9. window下上传文件至linux(windows下如何访问linux)

    ========相信我,按照步骤来一定能成功====== 我将从三个方面来说明:为什么要搭建访问服务器.如何搭建访问服务器.windows如下访问 为什么要搭建访问Linux服务器 我们都知道,服务器 ...

随机推荐

  1. POJ 3187 杨辉三角+枚举排列 好题

    如果给出一个由1~n组成的序列,我们可以每相邻2个数求和,得到一个新的序列,不断重复,最后得到一个数sum, 现在输入n,sum,要求输出一个这样的排列,如果有多种情况,输出字典序最小的那一个. 刚开 ...

  2. NeHe OpenGL教程 第十三课:图像字体

    转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...

  3. 常见的http头信息

    请求头:用于告诉服务器,客户机支持的数据类型 accept-charset:用于告诉服务器,客户机采用的编码 accept-Encoding:用于告诉服务器,客户机支持的数据压缩格式 Host:客户机 ...

  4. Awk 实例

    AWK 是一种用于处理文本的编程语言工具.AWK 在很多方面类似于 shell 编程语言,尽管 AWK 具有完全属于其本身的语法.它的设计思想来源于 SNOBOL4 .sed .Marc Rochki ...

  5. ZK框架的分析与应用

    前言:本文是在下的在学习ZK官方文档时整理出来的初稿.本来里面有很多的效果图片和图片代码的.奈何博客园中图片不能粘贴上去,所以感兴趣的筒子们就将就吧.内容中,如有不好的地方,欢迎斧正! ZK框架的分析 ...

  6. JS获取两个日期的月份差

    function getMonthBetween(startDate,endDate){ startDate=new Date(startDate.replace(/-/g,'/')); endDat ...

  7. [ActionScript 3.0] AS3 双A字模型

    package { import caurina.transitions.Tweener; import flash.display.Sprite; import flash.events.Mouse ...

  8. POJ 1149 PIGS 【网络流】

    题意: m n   //有m个猪圈,n个人卖猪. a1...am    //编号为i的猪圈里有ai头猪. b1 c1...cb1 d1   //第i个人有bi把钥匙,分别是ci猪圈的,其它猪圈里的猪都 ...

  9. Words in Coding Theory

    Lemma d(x.y) wt(c,0) self-dual self-orthogonal even prime wt(C) matrix column permute permutation ge ...

  10. Chapter Data Modification & Chapter Data Validation

    Chapter Data Modification XF的数据提交,支持单行.集合和多层次的master-details结构的数据. Create 当提交如下数据 <Job> <Id ...