您的位置:首页 > 编程语言 > C语言/C++

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就不能调用的话,可以及时跟我留言,这个已经解决
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: