问个关于c++读取远程web服务器上面图片文件的问题,希望大家来看看

因为一直都是没涉及读取web端的文件数据的,所以对这个可能不大了解

比方说,我有这么一个函数,他的功能是读取本地文件的数据,然后进行解密的:

void ImageDecryptShow::ParaseImageAndShow(std::string file_path, std::string decrypt_key)
{
// 需要计算出out_data的大小
ifstream fin_encrypt(file_path, ios::binary);
if (!fin_encrypt)
{
return;
}

fin_encrypt.seekg(0, ios::end);
int file_length_encrypt = fin_encrypt.tellg();

if (out_data_)
{
delete[] out_data_;
out_data_ = NULL;
}
out_data_ = new char[file_length_encrypt + 1];
memset(out_data_, 0, file_length_encrypt + 1);
fin_encrypt.close();

// 从文件中解密到数组中
DecryptRelation::AesDecryptFromFileToBytes( file_path, (unsigned char *)out_data_,
out_data_length_, decrypt_key.c_str(), 16);

LoadMemImage(&image_, out_data_, file_length_encrypt);
}


但是现在,这个file_path是传入的http://127.0.0.1/1.jpg
这个函数,打开就失败了。直接就在

if (!fin_encrypt)
{
return;
}

这里return了。


大家对于这个存在于web端的数据,都是怎么得到的?
...全文
317 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
以上的代码,包含有进度,不过不能跨平台只能在windows上使用
  • 打赏
  • 举报
回复
引用 1 楼 thefirstz 的回复:
需要有读取网络文件的方法,单靠ifstream 不行。
curl直接写到char*中,解决了。。贴另外一个,直接用windows API的例子,提供给同样需求的人:

// test_URLDownloadToFile.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include "iostream"
using namespace std;
#include "windows.h"

#include "URLmon.h"
#pragma comment(lib, "URLmon.lib")

#include <shlwapi.h>
#pragma comment(lib, "shlwapi.lib")

#include "wininet.h"
#pragma comment(lib, "wininet.lib")


class Callback : public IBindStatusCallback  
{
public:
	Callback()  {}
	~Callback() {}

	// IBindStatusCallback methods.  Note that the only method called by IE
	// is OnProgress(), so the others just return E_NOTIMPL.

	STDMETHOD(OnStartBinding)(
		/* [in] */ DWORD dwReserved,
		/* [in] */ IBinding __RPC_FAR *pib)
	{ return E_NOTIMPL; }

	STDMETHOD(GetPriority)(
		/* [out] */ LONG __RPC_FAR *pnPriority)
	{ return E_NOTIMPL; }

	STDMETHOD(OnLowResource)(
		/* [in] */ DWORD reserved)
	{ return E_NOTIMPL; }

	STDMETHOD(OnProgress)(
		/* [in] */ ULONG ulProgress,
		/* [in] */ ULONG ulProgressMax,
		/* [in] */ ULONG ulStatusCode,
		/* [in] */ LPCWSTR wszStatusText)
	{ 
	//	return E_NOTIMPL;
		static char current_progress_msg [256];
		static char already_download_size [256], file_total_size [256];
		if (ulProgressMax)
		{
			StrFormatByteSize ( ulProgress, already_download_size, 256 );
			StrFormatByteSize ( ulProgressMax, file_total_size, 256 );

			if ( 0 != ulProgressMax )
			{
				sprintf ( current_progress_msg, "Downloaded %s of %s",
					already_download_size, file_total_size );
			}
			else
			{
				sprintf ( current_progress_msg, "Downloaded %s (total size unknown)",
					already_download_size );
			}

			puts(current_progress_msg);
		}

		return S_OK;
	}

	STDMETHOD(OnStopBinding)(
		/* [in] */ HRESULT hresult,
		/* [unique][in] */ LPCWSTR szError)
	{ return E_NOTIMPL; }

	STDMETHOD(GetBindInfo)(
		/* [out] */ DWORD __RPC_FAR *grfBINDF,
		/* [unique][out][in] */ BINDINFO __RPC_FAR *pbindinfo)
	{ return E_NOTIMPL; }

	STDMETHOD(OnDataAvailable)(
		/* [in] */ DWORD grfBSCF,
		/* [in] */ DWORD dwSize,
		/* [in] */ FORMATETC __RPC_FAR *pformatetc,
		/* [in] */ STGMEDIUM __RPC_FAR *pstgmed)
	{ return E_NOTIMPL; }

	STDMETHOD(OnObjectAvailable)(
		/* [in] */ REFIID riid,
		/* [iid_is][in] */ IUnknown __RPC_FAR *punk)
	{ return E_NOTIMPL; }

	// IUnknown methods.  Note that IE never calls any of these methods, since
	// the caller owns the IBindStatusCallback interface, so the methods all
	// return zero/E_NOTIMPL.

	STDMETHOD_(ULONG,AddRef)()
	{ return 0; }

	STDMETHOD_(ULONG,Release)()
	{ return 0; }

	STDMETHOD(QueryInterface)(
		/* [in] */ REFIID riid,
		/* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject)
	{ return E_NOTIMPL; }
};


int _tmain(int argc, _TCHAR* argv[])
{
	HRESULT hr;
	Callback callback;
	
	string url_file_path  = "http://127.0.0.1/3.avi";
	string url_file_cache = "1.avi";

	// 去过不清空缓存,那么第二次还下载此文件,会得到文件信息为0
	BOOL delete_url_cache_flag = DeleteUrlCacheEntry(url_file_path.c_str());
	if (!delete_url_cache_flag)
	{
		puts("DeleteUrlCacheEntry failed..");
	}

	hr = URLDownloadToFile ( NULL,							// ptr to ActiveX container
							(LPCSTR)url_file_path.c_str(),  // URL to get
							(LPCSTR)url_file_cache.c_str(), // file to store data in
							0,								// reserved
							&callback						// ptr to IBindStatusCallback
							);

	if (FAILED(hr))
	{
		puts("failed..");
	}
	else
	{
		puts("finished...");
	}

	return 0;
}
昵称很不好取 2014-02-21
  • 打赏
  • 举报
回复
需要有读取网络文件的方法,单靠ifstream 不行。

64,318

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧