rest上传图片和下载图片(c#和c++)
2012-09-14 09:04
211 查看
用rest图片上传和下载:
上传:
思路:发布一个rest服务,客户端(c++/c#)用http协议调用这个rest服务。
(这里要注意的是不能用stream.length,会有异常,此流不能计算长度)
服务端核心代码:
[WebInvoke(UriTemplate = "UpLoad/{image}", Method = "POST")] public string UpLoad(Stream stream, string image) { StreamReader sr = null; var dir = System.Web.HttpContext.Current.Server.MapPath("~/Image"); var FilePath = Path.Combine(dir, image); long ByteLength = WebOperationContext.Current.IncomingRequest.ContentLength; using (FileStream fs = new FileStream(FilePath, FileMode.Create, FileAccess.Write, FileShare.None)) { byte[] fileContent = new byte[ByteLength]; stream.Read(fileContent, 0, fileContent.Length); fs.Write(fileContent, 0, fileContent.Length); fs.Flush(); } return FilePath; }
客户端的话支持c++和c#
首先给c#的demo:(不过用了Microsoft.Http.dll和Microsoft.Http.Extensions.dll这2个库写的一个模拟demo)
var ret = op.ShowDialog(); if (!ret.HasValue || !ret.Value || !op.CheckFileExists) return; var file = op.FileName; var name = System.IO.Path.GetFileName(file); var url = "http://192.168.0.33:3030/File/UpLoad/" + name; var client = new HttpClient(); var content = HttpContent.Create(File.OpenRead(file)); var resp = client.Post(url, content); resp.EnsureStatusIsSuccessful(); string str = resp.Content.ReadAsString(); MessageBox.Show(str); //服务返回的路径
c++与服务交互的demo:
CFile file; if(file.Open(_T("D:\\1.jpg"), CFile::modeRead)) { DWORD len = file.GetLength(); BYTE * pJpg = new BYTE[len]; file.Read(pJpg, len); file.Close(); CSendData send; CString strRetStr; send.SetServerParam(_T("127.0.0.1"), 3000); BOOL bRet = send.PostDataMethod(pJpg, len, _T("abc.jpg"), strRetStr); if(bRet) MessageBox(0, strRetStr, _T(""), 0); else MessageBox(0, send.GetLastError(), _T(""), 0); delete [] pJpg; } else MessageBox(0, _T("测试图片D:\\1.jpg打开失败"), _T(""), 0);
BOOL CSendData::PostDataMethod(LPBYTE pDataSend, DWORD dwDataSize, LPCTSTR szObjectName, CString & szRetString) { BOOL bRet; CString strName; CString strHeader; DWORD dwStatusCode; CInternetSession InternetSession; CHttpConnection *pHttp = NULL; CHttpFile *pFile = NULL; bRet = FALSE; dwStatusCode = 0; strName.Format(_T("%s\\%s"), HTTP_FUNCTION_NAME, szObjectName); try { pHttp = InternetSession.GetHttpConnection(m_strServerName, m_nPort); if(pHttp != NULL) { pFile = pHttp->OpenRequest(CHttpConnection::HTTP_VERB_POST, strName, NULL); if(pFile != NULL) { strHeader = _T("Content-Type: application/x-www-form-urlencoded"); //服务器端的头字符窜 if(TRUE == pFile->SendRequest(strHeader, pDataSend, dwDataSize)) { //查询状态 pFile->QueryInfoStatusCode(dwStatusCode); if(dwStatusCode == 200) { memset(m_szRetStr, 0, sizeof(m_szRetStr)); pFile->Read(m_szRetStr, sizeof(m_szRetStr)); ////转换编码 //CodeTransform(m_szRetStr, szRetString.GetBuffer(HTTP_RET_STR_MAX_LEN), HTTP_RET_STR_MAX_LEN); //szRetString.ReleaseBuffer(); szRetString =m_szRetStr; bRet = TRUE; } else m_strError = _T("服务器处理失败"); } else m_strError = _T("数据发送失败"); } else m_strError = _T("提交页面无法打开"); } else m_strError = _T("服务器无法连接"); //关闭 if(pFile != NULL) { pFile->Close(); delete pFile; pFile = NULL; } if(pHttp != NULL) { pHttp->Close(); delete pHttp; pHttp = NULL; } InternetSession.Close(); } catch (CInternetException * e) { e->GetErrorMessage(m_strError.GetBuffer(256), 256); m_strError.ReleaseBuffer(); e->Delete(); } return bRet; }
以2个demo均经过本人测试可用,至此图片上传已经完毕。
图片下载:这个的话很简单。
首先是rest服务代码:
服务的代码相当简单:具体如下:
[WebGet(UriTemplate = "{image}")] public Stream DownLoad(string image) { return DownloadFile(image); }
private Stream DownloadFile(string request) { //首先将请求的字符串解密成文件的真实路径 SymmetricMethod dec = new SymmetricMethod(); var requestStr = Decrypt(request,"12345678"); //dec.Decrypto(request); //Bitmap bit = new Bitmap(requestStr); //MemoryStream ms = new MemoryStream(); //bit.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg); //ms.Position = 0; //WebOperationContext.Current.OutgoingResponse.ContentType = "image/jpeg"; //return ms; return System.IO.File.OpenRead(requestStr); }
不过只写了c#调用rest的demo
string strUrlww = Decrypt(@"8A278601C181A3EF161CBDA88C4AB526EACB4F3F2D245C33B0B4427436076EF1BF2CA5C28BED014C9672D170FB547E141069F9538CC6C342", "12345678"); var picUrl = "http://192.168.0.206:3030/File/" + "8A278601C181A3EF161CBDA88C4AB526EACB4F3F2D245C33B0B4427436076EF1BF2CA5C28BED014C9672D170FB547E141069F9538CC6C342"; ImageButton1.ImageUrl = picUrl;
注意字符串加密,url一些特殊字符是不可以的
博客第二篇。
对了第一篇的话当发布到iis的话,如果大家发现exe就不能调用的话,可以及时跟我留言,这个已经解决
相关文章推荐
- [上传下载] C# ImageUpload图片上传类教程与源码下载 (转载)
- WCF REST 上传图片下载
- 服务器开发之Unity3d(C#)图片上传下载
- C# 上传图片到数据库,下载到picturebox里。
- C#通过简单的Http服务上传下载图片。
- C#通过简单的Http服务上传下载图片。
- C# ASP.NET 文件上传下载 下载时图片不自动打开
- C#实现上传下载图片
- ASP.NET(C#)实现一次性上传多张图片(多个文件)
- Springboot restTempate POST 上传图片
- Asp.net(c#)常用文件操作类封装 移动 复制 删除 上传 下载等
- phonegap上传以及下载图片
- 微信js-sdk图片上传下载——java完整流程
- Spring MVC 上传、下载、显示图片
- 图片ajax无刷新上传与图片下载
- C# 批量图片打包下载
- 利用AsyncHttpClient实现图片的上传与下载
- C#实现文件上传及文件下载功能实例代码
- java操作ftp实现文件的上传下载(适用于图片文档服务器)
- 在ASP.NET中上传图片并生成缩略图的C#源码