Skip to content

Commit 24ff512

Browse files
committed
Merge pull request #157 from thesadabc/put_readable
add putReadable, put data from Readable
2 parents 25bc998 + a0546a2 commit 24ff512

File tree

2 files changed

+54
-28
lines changed

2 files changed

+54
-28
lines changed

qiniu/io.js

Lines changed: 38 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ var fs = require('fs');
55
var getCrc32 = require('crc32');
66
var url = require('url');
77
var mime = require('mime');
8+
var Readable = require('stream').Readable;
89
var formstream = require('formstream');
910

1011
exports.UNDEFINED_KEY = '?'
@@ -13,6 +14,7 @@ exports.PutRet = PutRet;
1314
exports.put = put;
1415
exports.putWithoutKey = putWithoutKey;
1516
exports.putFile = putFile;
17+
exports.putReadable = putReadable;
1618
exports.putFileWithoutKey = putFileWithoutKey;
1719

1820
// @gist PutExtra
@@ -30,7 +32,7 @@ function PutRet(hash, key) {
3032
}
3133

3234
// onret: callback function instead of ret
33-
function put(uptoken, key, body, extra, onret) {
35+
function putReadable (uptoken, key, rs, extra, onret) {
3436
if(!extra) {
3537
extra = new PutExtra();
3638
}
@@ -42,35 +44,43 @@ function put(uptoken, key, body, extra, onret) {
4244
key = exports.UNDEFINED_KEY;
4345
}
4446

45-
var form = getMultipart(uptoken, key, body, extra);
47+
rs.on("error", function (err) {
48+
onret({code: -1, error: err.toString()}, {});
49+
});
50+
51+
var form = getMultipart(uptoken, key, rs, extra);
4652

4753
rpc.postMultipart(conf.UP_HOST, form, onret);
4854
}
4955

56+
function put(uptoken, key, body, extra, onret) {
57+
var rs = new Readable();
58+
rs.push(body);
59+
rs.push(null);
60+
61+
if(!extra) {
62+
extra = new PutExtra();
63+
}
64+
if (extra.checkCrc == 1) {
65+
var bodyCrc32 = getCrc32(body);
66+
extra.crc32 = '' + parseInt(bodyCrc32, 16);
67+
}
68+
putReadable(uptoken, key, rs, extra, onret)
69+
}
70+
5071
function putWithoutKey(uptoken, body, extra, onret) {
5172
put(uptoken, null, body, extra, onret);
5273
}
5374

54-
function getMultipart(uptoken, key, body, extra) {
75+
function getMultipart(uptoken, key, rs, extra) {
5576

5677
var form = formstream();
5778

5879
form.field('token', uptoken);
5980
if(key != exports.UNDEFINED_KEY) {
6081
form.field('key', key);
6182
}
62-
var buf = Buffer.isBuffer(body) ? body : new Buffer(body);
63-
form.buffer('file', buf, key, extra.mimeType);
64-
65-
//extra['checkcrc']
66-
if (extra.checkCrc == 1) {
67-
var bodyCrc32 = getCrc32(body);
68-
extra.crc32 = '' + parseInt(bodyCrc32, 16);
69-
}
70-
71-
if(extra.checkCrc) {
72-
form.field('crc32', extra.crc32);
73-
}
83+
form.stream('file', rs, key, extra.mimeType);
7484

7585
for (var k in extra.params) {
7686
form.field(k, extra.params[k]);
@@ -80,21 +90,21 @@ function getMultipart(uptoken, key, body, extra) {
8090
}
8191

8292
function putFile(uptoken, key, loadFile, extra, onret) {
83-
fs.readFile(loadFile, function(err, data) {
84-
if(err) {
85-
onret({code: -1, error: err.toString()}, {});
86-
return;
87-
}
8893

89-
if(!extra) {
90-
extra = new PutExtra();
91-
}
94+
var rs = fs.createReadStream(loadFile);
9295

93-
if(!extra.mimeType) {
94-
extra.mimeType = mime.lookup(loadFile);
95-
}
96-
put(uptoken, key, data, extra, onret);
97-
});
96+
if(!extra) {
97+
extra = new PutExtra();
98+
}
99+
if (extra.checkCrc == 1) {
100+
var fileCrc32 = getCrc32(fs.readFileSync(loadFile));
101+
extra.crc32 = '' + parseInt(fileCrc32, 16);
102+
}
103+
if(!extra.mimeType) {
104+
extra.mimeType = mime.lookup(loadFile);
105+
}
106+
107+
putReadable(uptoken, key, rs, extra, onret);
98108
}
99109

100110
function putFileWithoutKey(uptoken, loadFile, extra, onret) {

test/io.test.js

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
var qiniu = require('../');
22
var should = require('should');
33
var path = require('path');
4+
var fs = require('fs');
45

56
qiniu.conf.ACCESS_KEY = process.env.QINIU_ACCESS_KEY;
67
qiniu.conf.SECRET_KEY = process.env.QINIU_SECRET_KEY;
@@ -51,6 +52,21 @@ describe('test start step1:', function() {
5152
done();
5253
});
5354

55+
describe('io.putReadable()', function() {
56+
it('test upload from readableStrem', function(done) {
57+
var key = 'filename' + Math.random(1000);
58+
var rs = fs.createReadStream(imageFile);
59+
qiniu.io.putReadable(uptoken, key, rs, null, function(err, ret) {
60+
should.not.exist(err);
61+
ret.should.have.keys('hash', 'key');
62+
ret.key.should.equal(key);
63+
ret.hash.should.be.a('string');
64+
keys.push(ret.key);
65+
done();
66+
});
67+
});
68+
});
69+
5470
describe('io.put()', function() {
5571
it('test upload from memory', function(done) {
5672
var key = 'filename' + Math.random(1000);

0 commit comments

Comments
 (0)