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); //服务返回的路径


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);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就不能调用的话,可以及时跟我留言,这个已经解决