zoukankan      html  css  js  c++  java
  • WP8_(windows phone环境下)上传文件从C#到php接口

    在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("
    "), 0, DefaultEncoding.GetByteCount("
    "));
                    }
                    needsCLRF = true;
     
                    if (param.Value is FileParameter)
                    {
                        FileParameter fileToUpload = (FileParameter)param.Value;
     
                        string header = string.Format("--{0}
    Content-Disposition: form-data; name="{1}"; filename="{2}";
    Content-Type: {3}
    
    ",
                            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}
    Content-Disposition: form-data; name="{1}"
    
    {2}",
                            boundary,
                            param.Key,
                            param.Value);
                        formDataStream.Write(DefaultEncoding.GetBytes(postData), 0, DefaultEncoding.GetByteCount(postData));
                    }
                }
     
                string tailEnd = "
    --" + boundary + "--
    ";
                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

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

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

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

  • 相关阅读:
    QTreeWidget创建
    Qt QTreeWidget节点的添加+双击响应+删除详解(转)
    Qt QTreeWidget 树形结构实现(转)
    QMessageBox类学习:
    QAction类详解:
    Qt事件和信号的区别 .
    Qt消息机制和事件(二)
    Qt消息机制和事件(一)
    初步开始学习图
    图中最短路径算法(Dijkstra算法)(转)
  • 原文地址:https://www.cnblogs.com/jx270/p/3869037.html
Copyright © 2011-2022 走看看