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("\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接口的更多相关文章
- IIS环境下上传文件失败
跟随学习代码练习 php 上传文件,一开始是点击按钮后没有反应,不知道是否成功,使用 var_dump($_FILES) 查看,发现空空如也.遂百度一下,发现基本代码应如下 <form acti ...
- Git在windows下上传文件至github流程
github是开发者分享的一个平台,这里不多说,想要上传文件至github需要有一个开发者账号,还需要在windows下安装好了git. 做好准备工作之后,接下来操作 一:登录github,创建项目 ...
- docker在windows下上传文件到容器
我的系统是windows10,docker是用DockerToolbox工具安装的,安装完之后会默认挂载Windows的C:/Users目录,在docker里面对应路径是/c/Users,docker ...
- .NET环境下上传和下载Word文件
一.上传Word文档或者其他文档 1.简单地上传文件的web服务方法如下 [WebMethod] public void UploadFile() { using (TransactionScope ...
- 使用PuTTY在Windows中向Linux上传文件
为了防止无良网站的爬虫抓取文章,特此标识,转载请注明文章出处.LaplaceDemon/SJQ. http://www.cnblogs.com/shijiaqi1066/p/3843207.html ...
- 【阿里云产品公测】ACE下上传文件永久存储实践
本帖主要内容: ;$,=VB:' 在阿里云的ACE下,我是如何实现让上传的文件永久保存的? ,%"!8T 本文以PHP为例,具体知识点如下: WD# 96V 第一,扩展服务“存储 ...
- Windows服务器修改网站上传文件的大小限制
ASP程序 方法一: 修改该网站的的最大上传文件的大小限制 在Windows server上会出现上传大小受限制的问题,这是由于windows server的IIS管理器做了限制所致,IIS默认设置是 ...
- 不用FTP,直接Windows与Linux下互传文件
直接上传文件到Linux[1] Linux上输入命令:rz 直接下载Linux中的文件[2] 使用命令: sz 文件名 网上看到这个帖子,觉得很实用,转载保存 下载一个部署文件夹,到本地电脑 . 两步 ...
- window下上传文件至linux(windows下如何访问linux)
========相信我,按照步骤来一定能成功====== 我将从三个方面来说明:为什么要搭建访问服务器.如何搭建访问服务器.windows如下访问 为什么要搭建访问Linux服务器 我们都知道,服务器 ...
随机推荐
- Codeforces Round #363 (Div. 2) One Bomb
One Bomb 题意: 只有一个炸弹,并且一个只能炸一行和一列的'*',问最后能否炸完所以'*',如果可以输出炸弹坐标 题解: 这题做的时候真的没什么好想法,明知道b题应该不难,但只会瞎写,最后越写 ...
- BestCoder HDU 5750 Dertouzos
Dertouzos 题意: 有中文,不说. 题解: 我看了别人的题解,还有个地方没懂, 为什么是 if(d%prime[i]==0) break; ? 代码: #include <bits/st ...
- 获取js提交数据
无论是ajax(以XMLHttpRequest方式传输)还是表单的Get或Post方式提交(以HTTP方式传输),在asp.net中,get都是通过Request.QueryString[" ...
- 关于Rotation和Quaternion的一些问题
当我们使用unity的时候,面对一个物体,一个不可避免的问题就是:控制物体的旋转. unity的Transform组件的第二个属性Rotation为我们提供控制物体旋转的功能.在一个物体的Inspec ...
- 冲突--ListView与ScrollView冲突的4种解决方案
众所周知ListView与ScrollView都具有滚动能力,对于这样的View控件,当ScrollView与ListView相互嵌套会成为一种问题: 问题一:ScrollView与ListView嵌 ...
- Apache Thrift学习之一(入门及Java实例演示)
目录: 概述 下载配置 基本概念 数据类型 服务端编码基本步骤 客户端编码基本步骤 数据传输协议 实例演示(java) thrift生成代码 实现接口Iface TSimpleServer服务模型 T ...
- volatile适用场景
1.volatile最适用一个线程写,多个线程读的场合. 如果有多个线程并发写操作,仍然需要使用锁或者线程安全的容器或者原子变量来代替.(摘自Netty权威指南) 疑问:如果只是赋值的原子操作,是否可 ...
- SyntaxError: Non-UTF-8 code starting with '\xba' in file 错误的解决方法!!
第一次在Eclipse建立python工程,添加了自己新建的文件,写了一点代码,随后执行时候出现了错误,和昨天我在Visual Studio 2015里面一样,错误: SyntaxError: Non ...
- [原创博文] 用Python做统计分析 (Scipy.stats的文档)
[转自] 用Python做统计分析 (Scipy.stats的文档) 对scipy.stats的详细介绍: 这个文档说了以下内容,对python如何做统计分析感兴趣的人可以看看,毕竟Python的库也 ...
- codeblocks调试快捷键说明
使用codeblocks避免不了快捷键: 在调试程序的时候: 首先在view->toolbar->debugger调出来:快捷方式可以自己看 RUN to Cursor :F4 单步调试 ...