fengmk2/node-weibo — Issue #5: upload的建议
Author: rench
Created: 2011-11-22 06:27:48+00:00
State: open

/**
* 上传图片
* data: {user: user1, source: xxx, status: xxx, ...}
* pic: filepath
* callback: finish callback function
**/
upload: function(data, pic, callback, context) {
...
this.read_file(pic, function(file_buffer) {
......
}

//
read_file: function(pic, callback) {
if(typeof(pic) === 'string') {
fs.stat(pic, function(err, stats) {
fs.readFile(pic, function (err, file_buffer) {
if(!err)
callback(file_buffer);
});
});
} else {
callback(pic);
}
},
在read_file函数里面,如果传入的不是string类型的呢,直接callback,我的想法是 pic可能是直接传入pic的二进制内容,你这里做这样的处理,所以,觉得在注释中,pic的字段可以传入一个object,我尝试直接传入一个pic的二进制,发现能够上传成功,但是在构造请求体的时候
builder += '; filename="' + this.url_encode(fileinfo.name) + '"';
..
builder += 'Content-Type: '+ fileinfo.content_type + ';';
这里会不正确,因为当传入的pic为二进制时,

fileinfo: function(file) {
var name, content_type;
if(typeof(file) === 'string') {
var ext = path.extname(file);
content_type = this.FILE_CONTENT_TYPES[ext];
name = path.basename(file);
} else {
name = file.name || file.fileName;
content_type = file.fileType || file.type;
}
return {name: name, content_type: content_type};
},

这个参数不能取得 。。。从这里的写法可以看出,你是期待用户传入一个json对象,里面包含了 name或者type字段,但是如果是期待的是个json对象,为什么在read_file 函数里面是直接callback(pic)的呢,那回调的将是一个json对象,不可能上传json对象吧,感觉就很奇怪了。。。或许是我的理解错误，
我给的建议
/**
* 上传图片
* data: {user: user1, source: xxx, status: xxx, ...}
* pic: filepath/{type:'jpg',name:'1.jpg',data:buffer}
* callback: finish callback function
**/

read_file: function(pic, callback) {
if(typeof(pic) === 'string') {
fs.stat(pic, function(err, stats) {
fs.readFile(pic, function (err, file_buffer) {
if(!err)
callback(file_buffer);
});
});
} else {
callback(pic.data);
}
},

调用的方法
本地路径
upload(params,"/home/rench/aa.jpg",function(err,data,response){

})

自己获取的图片二进制内容/可扩展性,可以抓取远程图片upload到微博
upload(params,{type:"jpg",name:"a.jpg",data:buffer},function(err,data,response){

})

185656156@qq.com