rest上传图片和下载图片(c#和c++)
来源:互联网 发布:redis mysql完美结合 编辑:程序博客网 时间:2024/06/02 07:30
用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); //服务返回的路径
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);elseMessageBox(0, send.GetLastError(), _T(""), 0);delete [] pJpg;}elseMessageBox(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;CInternetSessionInternetSession;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;}elsem_strError = _T("服务器处理失败");}elsem_strError = _T("数据发送失败");}elsem_strError = _T("提交页面无法打开");}elsem_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就不能调用的话,可以及时跟我留言,这个已经解决
- rest上传图片和下载图片(c#和c++)
- 图片上传和下载
- 图片及文件上传和下载
- 图片及文件上传和下载
- Android中图片的上传和下载
- Android中图片的上传和下载
- Android中图片的上传和下载
- Android中图片的上传和下载
- IOS 图片多线程下载和上传
- untiy实现图片的上传和下载
- jsp实现图片的上传和下载
- Unity实现图片的上传和下载
- 图片的上传和curl下载分析
- C#图片上传与下载
- MVC图片的上传和下载(简单实现)
- C# WebAPI 上传文件和图片
- 上传图片和图片处理
- SAE 上传图片(本地图片和网络图片)
- HDU 4003--Find Metal Mineral(树形dp)
- <每日一句英语>2012-9-14
- 一个很好的书籍下载网站
- android颜色对应的xml配置值
- SUN系统维护命令大全 ZT
- rest上传图片和下载图片(c#和c++)
- AutoFlowchart新框架基本完成!
- 最近觉得很是无奈啊
- 枚举初步
- c# 字符串处理
- C语言修饰词之violate
- VS2012 远程调试
- 关于ASP.NET页面打印技术的总结
- Linux 下使用mount命令挂载CDROM