使用lincurl下载的图片为什么打不开

jiang江江 2014-07-30 10:10:59
#include <stdio.h>
#include <curl/curl.h>
#include<string>
#include<sqlite3.h>
#include<iostream>
#include<fstream>
#include<vector>
#include<Windows.h>
using namespace std;
//写入函数

static size_t get_count();
size_t write_data(void *ptr, size_t size, size_t count,char *stream)
{
memcpy(stream,ptr,get_count()/sizeof(char));
//printf("%s",ptr);
return count;}

//获取应下载文件大小
size_t save_data(void *ptr, size_t size , size_t count,char *stream)
{
return count*size;
}

static size_t get_count(){
CURL *curl;
CURLcode res;
res=curl_global_init(CURL_GLOBAL_WIN32);
double filesize=0;
curl_global_init(CURL_GLOBAL_ALL);
curl = curl_easy_init();
if (curl) {
res=curl_easy_setopt(curl, CURLOPT_URL, "http://cdn.duitang.com/uploads/item/201111/09/20111109230753_kaeuy.thumb.600_0.jpg");
res=curl_easy_setopt(curl, CURLOPT_NOBODY, 1L);
/* res=curl_easy_setopt(curl, CURLOPT_FILETIME, 1L);*/
res=curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, save_data);
res=curl_easy_setopt(curl, CURLOPT_HEADER, 0L);
//curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);

res=curl_easy_perform(curl);

if (res == CURLE_OK) {
res = curl_easy_getinfo(curl, CURLINFO_CONTENT_LENGTH_DOWNLOAD, &filesize);
} else {
filesize = -1;
}
return filesize;
}
}
int main()
{
//初始化
CURLcode res;
res = curl_global_init(CURL_GLOBAL_WIN32);
CURL *curl_handle;
curl_handle = curl_easy_init();
char *zErrMsg = 0;
size_t fsize=0;
fsize = get_count();
char*fp = new char[fsize/sizeof(char)+1];
if(res!=CURLE_OK)
{
std::cerr<<"initialize libcurl failed";
return-1;
}
if(curl_handle!=NULL)
{
res = curl_easy_setopt(curl_handle, CURLOPT_URL, "http://cdn.duitang.com/uploads/item/201111/09/20111109230753_kaeuy.thumb.600_0.jpg" );
res = curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, write_data);
res = curl_easy_setopt(curl_handle, CURLOPT_WRITEDATA, fp);
res = curl_easy_perform(curl_handle);

//读入数据库
sqlite3 *db;
sqlite3_stmt *stat;
int value= sqlite3_open("f:/ceshi/gtestpic.db", &db);
sqlite3_exec(db, "CREATE TABLE list (fliename varchar(128) UNIQUE, fzip blob);", 0, 0, &zErrMsg);
sqlite3_prepare(db, "insert into list values ('download',?);", -1, &stat, 0);
sqlite3_bind_blob(stat,1,fp,fsize/sizeof(char), NULL);
sqlite3_step(stat);

//选取该条数据
char buffer2[111111]="0";
sqlite3_prepare(db, "select*from list;", -1, &stat, 0);
sqlite3_step(stat);
//得到记录中的BLOB字段
const void * test = sqlite3_column_blob(stat, 1);
//得到字段中数据的长度
int size = sqlite3_column_bytes(stat, 1);
//拷贝该字段
sprintf(buffer2, "%s", test);
FILE *fp2;
fp2 = fopen("f:/ceshi/outfile.jpg", "wb");
if(fp2 != NULL)
{
size_t ret = fwrite(test, sizeof(char), size, fp2);
fclose(fp2);
}
//释放资源
delete[]fp;
sqlite3_finalize(stat);
sqlite3_close(db);
}

//释放资源

curl_easy_cleanup(curl_handle);
curl_global_cleanup();


return 0;
}

自己写了一个下载图片数据不经过本地存储直接加载到数据库中的小程序,但是为什么加载到数据库中的文件打不开呢?
...全文
206 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
jiang江江 2014-08-04
  • 打赏
  • 举报
回复
找到答案了,write_data中的读入流写成stream。再换个函数就可以了
jiang江江 2014-07-31
  • 打赏
  • 举报
回复
这只是个测试图片有没有加载的,程序里是没有这个的,不过我以后会注意了
sniffer12345 2014-07-30
  • 打赏
  • 举报
回复
//拷贝该字段 sprintf(buffer2, "%s", test); 这样写肯定会被你的主程骂的。。二进制和文本得区分好啊骚年

3,882

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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