diff --git a/README_zh_CN.md b/README_zh_CN.md
new file mode 100644
index 00000000..3b39f7fb
--- /dev/null
+++ b/README_zh_CN.md
@@ -0,0 +1,197 @@
+# 适用于Amazon S3兼容云存储的Minio JavaScript Library [![Slack](https://slack.minio.io/slack?type=svg)](https://slack.minio.io)
+
+[![NPM](https://nodei.co/npm/minio.png)](https://nodei.co/npm/minio/)
+
+Minio JavaScript Client SDK提供简单的API来访问任何Amazon S3兼容的对象存储服务。
+
+本快速入门指南将向您展示如何安装客户端SDK并执行示例JavaScript程序。有关API和示例的完整列表,请参阅[JavaScript客户端API参考](https://docs.minio.io/docs/javascript-client-api-reference)文档。
+
+本文假设你已经安装了[nodejs](http://nodejs.org/) 。
+
+## 使用NPM下载
+
+```sh
+npm install --save minio
+```
+
+## 下载并安装源码
+
+```sh
+git clone https://github.com/minio/minio-js
+cd minio-js
+npm install
+npm install -g
+```
+
+## 初使化Minio Client
+
+你需要设置5个属性来链接Minio对象存储服务。
+
+| 参数 | 描述 |
+| :------- | :------------ |
+| endPoint |对象存储服务的URL |
+|port| TCP/IP端口号。可选值,如果是使用HTTP的话,默认值是`80`;如果使用HTTPS的话,默认值是`443`。|
+| accessKey | Access key是唯一标识你的账户的用户ID。 |
+| secretKey | Secret key是你账户的密码。 |
+|secure |true代表使用HTTPS |
+
+
+```js
+var Minio = require('minio')
+
+var minioClient = new Minio.Client({
+ endPoint: 'play.minio.io',
+ port: 9000,
+ secure: true,
+ accessKey: 'Q3AM3UQ867SPQQA43P2F',
+ secretKey: 'zuf+tfteSlswRu7BJ86wekitnifILbZam1KYY3TG'
+});
+```
+
+## 示例-文件上传
+
+本示例连接到一个对象存储服务,创建一个存储桶并上传一个文件到存储桶中。
+
+我们在本示例中使用运行在 [https://play.minio.io:9000](https://play.minio.io:9000) 上的Minio服务,你可以用这个服务来开发和测试。示例中的访问凭据是公开的。
+
+#### file-uploader.js
+
+```js
+var Minio = require('minio')
+
+// Instantiate the minio client with the endpoint
+// and access keys as shown below.
+var minioClient = new Minio.Client({
+ endPoint: 'play.minio.io',
+ port: 9000,
+ secure: true,
+ accessKey: 'Q3AM3UQ867SPQQA43P2F',
+ secretKey: 'zuf+tfteSlswRu7BJ86wekitnifILbZam1KYY3TG'
+});
+
+// File that needs to be uploaded.
+var file = '/tmp/photos-europe.tar'
+
+// Make a bucket called europetrip.
+minioClient.makeBucket('europetrip', 'us-east-1', function(err) {
+ if (err) return console.log(err)
+
+ console.log('Bucket created successfully in "us-east-1".')
+
+ // Using fPutObject API upload your file to the bucket europetrip.
+ minioClient.fPutObject('europetrip', 'photos-europe.tar', file, 'application/octet-stream', function(err, etag) {
+ if (err) return console.log(err)
+ console.log('File uploaded successfully.')
+ });
+});
+```
+
+#### 运行file-uploader
+
+```sh
+node file-uploader.js
+Bucket created successfully in "us-east-1".
+
+mc ls play/europetrip/
+[2016-05-25 23:49:50 PDT] 17MiB photos-europe.tar
+```
+
+## API文档
+
+完整的API文档在这里。
+* [完整API文档](https://docs.minio.io/docs/javascript-client-api-reference)
+
+### API文档 : 操作存储桶
+
+* [`makeBucket`](https://docs.minio.io/docs/javascript-client-api-reference#makeBucket)
+* [`listBuckets`](https://docs.minio.io/docs/javascript-client-api-reference#listBuckets)
+* [`bucketExists`](https://docs.minio.io/docs/javascript-client-api-reference#bucketExists)
+* [`removeBucket`](https://docs.minio.io/docs/javascript-client-api-reference#removeBucket)
+* [`listObjects`](https://docs.minio.io/docs/javascript-client-api-reference#listObjects)
+* [`listObjectsV2`](https://docs.minio.io/docs/javascript-client-api-reference#listObjectsV2)
+* [`listIncompleteUploads`](https://docs.minio.io/docs/javascript-client-api-reference#listIncompleteUploads)
+
+### API文档 : 操作文件对象
+
+* [`fPutObject`](https://docs.minio.io/docs/javascript-client-api-reference#fPutObject)
+* [`fGetObject`](https://docs.minio.io/docs/javascript-client-api-reference#fGetObject)
+
+### API文档 : 操作对象
+
+* [`getObject`](https://docs.minio.io/docs/javascript-client-api-reference#getObject)
+* [`putObject`](https://docs.minio.io/docs/javascript-client-api-reference#putObject)
+* [`copyObject`](https://docs.minio.io/docs/javascript-client-api-reference#copyObject)
+* [`statObject`](https://docs.minio.io/docs/javascript-client-api-reference#statObject)
+* [`removeObject`](https://docs.minio.io/docs/javascript-client-api-reference#removeObject)
+* [`removeIncompleteUpload`](https://docs.minio.io/docs/javascript-client-api-reference#removeIncompleteUpload)
+
+### API文档 : Presigned操作
+
+* [`presignedGetObject`](https://docs.minio.io/docs/javascript-client-api-reference#presignedGetObject)
+* [`presignedPutObject`](https://docs.minio.io/docs/javascript-client-api-reference#presignedPutObject)
+* [`presignedPostPolicy`](https://docs.minio.io/docs/javascript-client-api-reference#presignedPostPolicy)
+
+### API文档 : 存储桶通知
+
+* [`getBucketNotification`](https://docs.minio.io/docs/javascript-client-api-reference#getBucketNotification)
+* [`setBucketNotification`](https://docs.minio.io/docs/javascript-client-api-reference#setBucketNotification)
+* [`removeAllBucketNotification`](https://docs.minio.io/docs/javascript-client-api-reference#removeAllBucketNotification)
+* [`listenBucketNotification`](https://docs.minio.io/docs/javascript-client-api-reference#listenBucketNotification) (Minio Extension)
+
+### API文档 : 存储桶策略
+
+* [`getBucketPolicy`](https://docs.minio.io/docs/javascript-client-api-reference#getBucketPolicy)
+* [`setBucketPolicy`](https://docs.minio.io/docs/javascript-client-api-reference#setBucketPolicy)
+
+
+## 完整示例
+
+#### 完整示例 : 操作存储桶
+
+* [list-buckets.js](https://github.com/minio/minio-js/blob/master/examples/list-buckets.js)
+* [list-objects.js](https://github.com/minio/minio-js/blob/master/examples/list-objects.js)
+* [list-objects-v2.js](https://github.com/minio/minio-js/blob/master/examples/list-objects-v2.js)
+* [bucket-exists.js](https://github.com/minio/minio-js/blob/master/examples/bucket-exists.js)
+* [make-bucket.js](https://github.com/minio/minio-js/blob/master/examples/make-bucket.js)
+* [remove-bucket.js](https://github.com/minio/minio-js/blob/master/examples/remove-bucket.js)
+* [list-incomplete-uploads.js](https://github.com/minio/minio-js/blob/master/examples/list-incomplete-uploads.js)
+
+#### 完整示例 : 操作文件对象
+* [fput-object.js](https://github.com/minio/minio-js/blob/master/examples/fput-object.js)
+* [fget-object.js](https://github.com/minio/minio-js/blob/master/examples/fget-object.js)
+
+#### 完整示例 : 操作对象
+* [put-object.js](https://github.com/minio/minio-js/blob/master/examples/put-object.js)
+* [get-object.js](https://github.com/minio/minio-js/blob/master/examples/get-object.js)
+* [copy-object.js](https://github.com/minio/minio-js/blob/master/examples/copy-object.js)
+* [get-partialobject.js](https://github.com/minio/minio-js/blob/master/examples/get-partialobject.js)
+* [remove-object.js](https://github.com/minio/minio-js/blob/master/examples/remove-object.js)
+* [remove-incomplete-upload.js](https://github.com/minio/minio-js/blob/master/examples/remove-incomplete-upload.js)
+* [stat-object.js](https://github.com/minio/minio-js/blob/master/examples/stat-object.js)
+
+#### 完整示例 : Presigned操作
+* [presigned-getobject.js](https://github.com/minio/minio-js/blob/master/examples/presigned-getobject.js)
+* [presigned-putobject.js](https://github.com/minio/minio-js/blob/master/examples/presigned-putobject.js)
+* [presigned-postpolicy.js](https://github.com/minio/minio-js/blob/master/examples/presigned-postpolicy.js)
+
+####完整示例 : 存储桶通知
+* [get-bucket-notification.js](https://github.com/minio/minio-js/blob/master/examples/get-bucket-notification.js)
+* [set-bucket-notification.js](https://github.com/minio/minio-js/blob/master/examples/set-bucket-notification.js)
+* [remove-all-bucket-notification.js](https://github.com/minio/minio-js/blob/master/examples/remove-all-bucket-notification.js)
+* [listen-bucket-notification.js](https://github.com/minio/minio-js/blob/master/examples/minio/listen-bucket-notification.js) (Minio Extension)
+
+#### 完整示例 : 存储桶策略
+* [get-bucket-policy.js](https://github.com/minio/minio-js/blob/master/examples/get-bucket-policy.js)
+* [set-bucket-policy.js](https://github.com/minio/minio-js/blob/master/examples/set-bucket-policy.js)
+
+## 了解更多
+* [完整文档](https://docs.minio.io)
+* [Minio JavaScript Client SDK API文档](https://docs.minio.io/docs/javascript-client-api-reference)
+* [创建属于你的购物APP-完整示例](https://docs.minio.io/docs/javascript-shopping-app)
+
+## 贡献
+
+[贡献者指南](https://github.com/minio/minio-js/blob/master/CONTRIBUTING.md)
+
+[![Build Status](https://travis-ci.org/minio/minio-js.svg)](https://travis-ci.org/minio/minio-js)
+[![Build status](https://ci.appveyor.com/api/projects/status/1d05e6nvxcelmrak?svg=true)](https://ci.appveyor.com/project/harshavardhana/minio-js)
diff --git a/docs/zh_CN/API.md b/docs/zh_CN/API.md
new file mode 100644
index 00000000..d8dc3f2d
--- /dev/null
+++ b/docs/zh_CN/API.md
@@ -0,0 +1,1003 @@
+# JavaScript Client API参考文档 [![Slack](https://slack.minio.io/slack?type=svg)](https://slack.minio.io)
+
+## 初使化Minio Client object.
+
+## Minio
+
+```js
+var Minio = require('minio')
+
+var minioClient = new Minio.Client({
+ endPoint: 'play.minio.io',
+ port: 9000,
+ secure: true,
+ accessKey: 'Q3AM3UQ867SPQQA43P2F',
+ secretKey: 'zuf+tfteSlswRu7BJ86wekitnifILbZam1KYY3TG'
+});
+```
+
+## AWS S3
+
+```js
+var Minio = require('minio')
+
+var s3Client = new Minio.Client({
+ endPoint: 's3.amazonaws.com',
+ accessKey: 'YOUR-ACCESSKEYID',
+ secretKey: 'YOUR-SECRETACCESSKEY'
+})
+```
+| 操作存储桶 | 操作对象 | Presigned操作 | 存储桶策略/通知 |
+| ------------- |-------------| -----| ----- |
+| [`makeBucket`](#makeBucket) | [`getObject`](#getObject) | [`presignedUrl`](#presignedUrl) | [`getBucketNotification`](#getBucketNotification) |
+| [`listBuckets`](#listBuckets) | [`getPartialObject`](#getPartialObject) | [`presignedGetObject`](#presignedGetObject) | [`setBucketNotification`](#setBucketNotification) |
+| [`bucketExists`](#bucketExists) | [`fGetObject`](#fGetObject) | [`presignedPutObject`](#presignedPutObject) | [`removeAllBucketNotification`](#removeAllBucketNotification) |
+| [`removeBucket`](#removeBucket) | [`putObject`](#putObject) | [`presignedPostPolicy`](#presignedPostPolicy) | [`getBucketPolicy`](#getBucketPolicy) | |
+| [`listObjects`](#listObjects) | [`fPutObject`](#fPutObject) | | [`setBucketPolicy`](#setBucketPolicy)
+| [`listObjectsV2`](#listObjectsV2) | [`copyObject`](#copyObject) | | [`listenBucketNotification`](#listenBucketNotification)|
+| [`listIncompleteUploads`](#listIncompleteUploads) | [`statObject`](#statObject) |
+| | [`removeObject`](#removeObject) |
+| | [`removeIncompleteUpload`](#removeIncompleteUpload) |
+
+
+
+## 1. 构造函数
+
+
+### new Minio.Client ({endPoint, port, secure, accessKey, secretKey})
+
+| |
+| ---- |
+|``new Minio.Client ({endPoint, port, secure, accessKey, secretKey})``|
+|初使化一个新的client对象。|
+
+__参数__
+
+| 参数| 类型 | 描述 |
+|---|---|---|
+| `endPoint` | _string_ | endPoint是一个主机名或者IP地址。 |
+| `port` | _number_ | TCP/IP端口号。可选,默认值是,如果是http,则默认80端口,如果是https,则默认是443端口。 |
+| `accessKey` | _string_ |accessKey类似于用户ID,用于唯一标识你的账户。 |
+|`secretKey` | _string_ | secretKey是你账户的密码。|
+|`secure` | _bool_ |如果是true,则用的是https而不是http,默认值是true。 |
+|`region` | _string_ |设置该值以覆盖自动发现存储桶region。(可选)|
+
+
+__示例__
+
+## 创建连接Minio Server的客户端
+
+```js
+var Minio = require('minio')
+
+var minioClient = new Minio.Client({
+ endPoint: 'play.minio.io',
+ port: 9000,
+ secure: true,
+ accessKey: 'Q3AM3UQ867SPQQA43P2F',
+ secretKey: 'zuf+tfteSlswRu7BJ86wekitnifILbZam1KYY3TG'
+});
+```
+
+## 创建连接AWS S3的客户端
+
+
+```js
+var Minio = require('minio')
+
+var s3Client = new Minio.Client({
+ endPoint: 's3.amazonaws.com',
+ accessKey: 'YOUR-ACCESSKEYID',
+ secretKey: 'YOUR-SECRETACCESSKEY'
+})
+```
+
+
+## 2. 操作存储桶
+
+
+### makeBucket(bucketName, region[, callback])
+
+创建一个新的存储桶。
+
+__参数__
+
+| 参数| 类型 | 描述 |
+|---|---|---|
+|`bucketName` | _string_ | 存储桶名称。 |
+| `region` | _string_ | 存储桶被创建的region(地区),默认是us-east-1(美国东一区),下面列举的是其它合法的值: |
+| | |us-east-1 |
+| | |us-west-1 |
+| | |us-west-2 |
+| | |eu-west-1 |
+| | |eu-central-1|
+| | |ap-southeast-1|
+| | |ap-northeast-1|
+| | |ap-southeast-2|
+| | |sa-east-1|
+| | |cn-north-1|
+|`callback(err)` |_function_ | 回调函数,`err`做为错误信息参数。如果创建存储桶成功则`err`为null。如果没有传callback的话,则返回一个`Promise`对象。 |
+
+
+__示例__
+
+
+```js
+minioClient.makeBucket('mybucket', 'us-east-1', function(err) {
+ if (err) return console.log('Error creating bucket.', err)
+ console.log('Bucket created successfully in "us-east-1".')
+})
+```
+
+
+### listBuckets([callback])
+
+列出所有存储桶。
+
+
+__参数__
+
+
+| 参数| 类型 | 描述 |
+|---|---|---|
+|`callback(err, bucketStream) ` | _function_ | 回调函数,第一个参数是错误信息。`bucketStream`是带有存储桶信息的流。如果没有传callback的话,则返回一个`Promise`对象。|
+
+bucketStream格式如下:-
+
+| 参数| 类型 | 描述 |
+|---|---|---|
+|`bucket.name` | _string_ |存储桶名称 |
+|`bucket.creationDate`| _Date_ |存储桶创建时间。 |
+
+
+
+__示例__
+
+
+```js
+minioClient.listBuckets(function(err, buckets) {
+ if (err) return console.log(err)
+ console.log('buckets :', buckets)
+})
+```
+
+
+#### bucketExists(bucketName[, callback])
+
+验证存储桶是否存在。
+
+
+__参数__
+
+
+| 参数| 类型 | 描述 |
+|---|---|---|
+| `bucketName` | _string_ | 存储桶名称。 |
+| `callback(err)` | _function_ | 如果存储桶存在的话`err`就是null,否则`err.code`是`NoSuchBucket`。如果没有传callback的话,则返回一个`Promise`对象。 |
+
+__示例__
+
+
+```js
+minioClient.bucketExists('mybucket', function(err) {
+ if (err) {
+ if (err.code == 'NoSuchBucket') return console.log("bucket does not exist.")
+ return console.log(err)
+ }
+ // if err is null it indicates that the bucket exists.
+ console.log('Bucket exists.')
+})
+```
+
+
+### removeBucket(bucketName[, callback])
+
+删除存储桶。
+
+__参数__
+
+
+| 参数 | 类型 | 描述 |
+|---|---|---|
+| `bucketName` | _string_ | 存储桶名称。 |
+| `callback(err)` | _function_ | 如果存储桶删除成功则`err`为`null`。如果没有传callback的话,则返回一个`Promise`对象。 |
+
+__示例__
+
+
+```js
+minioClient.removeBucket('mybucket', function(err) {
+ if (err) return console.log('unable to remove bucket.')
+ console.log('Bucket removed successfully.')
+})
+```
+
+
+### listObjects(bucketName, prefix, recursive)
+
+列出存储桶中所有对象。
+
+__参数__
+
+
+| 参数 | 类型 | 描述 |
+| ---- | ---- | ---- |
+| `bucketName` | _string_ | 存储桶名称。 |
+| `prefix` | _string_ | 要列出的对象的前缀 (可选,默认值是`''`)。 |
+| `recursive` | _bool_ | `true`代表递归查找,`false`代表类似文件夹查找,以'/'分隔,不查子文件夹。(可选,默认值是`false`) |
+
+
+__返回值__
+
+
+| 参数 | 类型 | 描述 |
+| ---- | ---- | ---- |
+| `stream` | _Stream_ | 存储桶中对象信息的流。 |
+
+对象的格式如下:
+
+| 参数 | 类型 | 描述 |
+| ---- | ---- | ---- |
+| `obj.key` | _string_ | 对象名称。 |
+| `obj.size` | _number_ | 对象的大小。 |
+| `obj.etag` | _string_ |对象的etag值。 |
+| `obj.lastModified` | _Date_ | 最后修改时间。 |
+
+__示例__
+
+
+```js
+var stream = minioClient.listObjects('mybucket','', true)
+stream.on('data', function(obj) { console.log(obj) } )
+stream.on('error', function(err) { console.log(err) } )
+```
+
+
+### listObjectsV2(bucketName, prefix, recursive)
+
+使用S3 listing objects V2版本API列出所有对象。
+
+__参数__
+
+
+| 参数 | 类型 | 描述 |
+| ---- | ---- | ---- |
+| `bucketName` | _string_ | 存储桶名称。 |
+| `prefix` | _string_ | 要列出的对象的前缀。(可选,默认值是`''`) |
+| `recursive` | _bool_ | `true`代表递归查找,`false`代表类似文件夹查找,以'/'分隔,不查子文件夹。(可选,默认值是`false`) |
+
+
+__返回值__
+
+| 参数 | 类型 | 描述 |
+| ---- | ---- | ---- |
+| `stream` | _Stream_ | 存储桶中对象信息的流。 |
+
+对象的格式如下:
+
+| 参数 | 类型 | 描述 |
+| ---- | ---- | ---- |
+| `obj.key` | _string_ | 对象名称。 |
+| `obj.size` | _number_ | 对象的大小。 |
+| `obj.etag` | _string_ |对象的etag值。 |
+| `obj.lastModified` | _Date_ | 最后修改时间。 |
+
+
+__示例__
+
+
+```js
+var stream = minioClient.listObjectsV2('mybucket','', true)
+stream.on('data', function(obj) { console.log(obj) } )
+stream.on('error', function(err) { console.log(err) } )
+```
+
+
+
+### listIncompleteUploads(bucketName, prefix, recursive)
+
+列出存储桶中未完整上传的对象。
+
+__参数__
+
+
+| 参数 | 类型 | 描述 |
+| ---| ---|---|
+| `bucketname` | _string_ | 存储桶名称。 |
+| `prefix` | _string_ | 未完整上传的对象的前缀。(可选,默认值是`''`)。 |
+| `recursive` | _bool_ | `true`代表递归查找,`false`代表类似文件夹查找,以'/'分隔,不查子文件夹。(可选,默认值是`false`) |
+
+
+__返回值__
+
+
+| 参数 | 类型 | 描述 |
+| ---| ---|---|
+| `stream` | _Stream_ | 对象格式如下:|
+
+| 参数 | 类型 | 描述 |
+| ---| ---|---|
+| `part.key` | _string_ | 对象名称。|
+| `part.uploadId` | _string_ | 对象的上传ID。|
+| `part.size` | _Integer_ | 未完整上传的对象的大小。|
+
+__示例__
+
+
+```js
+var Stream = minioClient.listIncompleteUploads('mybucket', '', true)
+Stream.on('data', function(obj) {
+ console.log(obj)
+})
+Stream.on('end', function() {
+ console.log('End')
+})
+Stream.on('error', function(err) {
+ console.log(err)
+})
+```
+
+## 3. 操作对象
+
+
+### getObject(bucketName, objectName[, callback])
+
+下载对象。
+
+__参数__
+
+
+| 参数 | 类型 | 描述 |
+|---|---|---|
+|`bucketName` | _string_ | 存储桶名称。 |
+|`objectName` | _string_ | 对象名称。 |
+|`callback(err, stream)` | _function_ | 回调函数,第一个参数是错误信息。`stream`是对象的内容。如果没有传callback的话,则返回一个`Promise`对象。 |
+
+__示例__
+
+
+```js
+var size = 0
+minioClient.getObject('mybucket', 'photo.jpg', function(err, dataStream) {
+ if (err) {
+ return console.log(err)
+ }
+ dataStream.on('data', function(chunk) {
+ size += chunk.length
+ })
+ dataStream.on('end', function() {
+ console.log('End. Total size = ' + size)
+ })
+ dataStream.on('error', function(err) {
+ console.log(err)
+ })
+})
+```
+
+### getPartialObject(bucketName, objectName, offset, length[, callback])
+
+下载对象中指定区间的字节数组,并返回流。
+
+__参数__
+
+
+| 参数 | 类型 | 描述 |
+|---|---|---|
+| `bucketName` | _string_ | 存储桶名称。 |
+| `objectName` | _string_ | 对象名称。 |
+| `offset` | _number_ | `offset`是从第几个字节始 |
+| `length` | _number_ | `length`是要下载的字节数组长度(可选值,如果为空的话则代表从offset一直到文件的末尾)。 |
+|`callback(err, stream)` | _function_ | 回调函数,第一个参数是错误信息。`stream`是对象的内容。如果没有传callback的话,则返回一个`Promise`对象。 |
+
+__示例__
+
+
+```js
+var size = 0
+// reads 30 bytes from the offset 10.
+minioClient.getPartialObject('mybucket', 'photo.jpg', 10, 30, function(err, dataStream) {
+ if (err) {
+ return console.log(err)
+ }
+ dataStream.on('data', function(chunk) {
+ size += chunk.length
+ })
+ dataStream.on('end', function() {
+ console.log('End. Total size = ' + size)
+ })
+ dataStream.on('error', function(err) {
+ console.log(err)
+ })
+})
+```
+
+
+### fGetObject(bucketName, objectName, filePath[, callback])
+
+下载并将对象保存成本地文件。
+
+__参数__
+
+| 参数 | 类型 | 描述 |
+|---|---|---|
+| `bucketName` | _string_ | 存储桶名称。 |
+| `objectName` |_string_ | 对象名称。 |
+| `filePath` | _string_ | 要写入的本地文件路径。 |
+| `callback(err)` | _function_ | 如果报错的话,则会调用回调函数,传入`err`参数。 如果没有传callback的话,则返回一个`Promise`对象。 |
+
+
+__示例__
+
+
+```js
+var size = 0
+minioClient.fGetObject('mybucket', 'photo.jpg', '/tmp/photo.jpg', function(err) {
+ if (err) {
+ return console.log(err)
+ }
+ console.log('success')
+})
+```
+
+### putObject(bucketName, objectName, stream, size, contentType[, callback])
+
+从一个stream/Buffer中上传一个对象。
+
+##### 从stream中上传
+
+__参数__
+
+
+| 参数 | 类型 | 描述 |
+|---|---|---|
+| `bucketName` |_string_ | 存储桶名称。 |
+| `objectName` |_string_ | 对象名称。 |
+| `stream` | _Stream_ |可以读的流。 |
+|`size` | _number_ | 对象的大小(可选)。 |
+|`contentType` | _string_ | 对象的Content-Type(可选,默认是`application/octet-stream`)。|
+| `callback(err, etag)` | _function_ | 如果`err`不是null则代表有错误,`etag` _string_是上传的对象的etag值。如果没有传callback的话,则返回一个`Promise`对象。 |
+
+
+__示例__
+
+单个对象的最大大小限制在5TB。putObject在对象大于5MiB时,自动使用multiple parts方式上传。这样的话,当上传失败的时候,客户端只需要上传未成功的部分即可(类似断点上传)。上传的对象使用MD5SUM签名进行完整性验证。
+
+```js
+var Fs = require('fs')
+var file = '/tmp/40mbfile'
+var fileStream = Fs.createReadStream(file)
+var fileStat = Fs.stat(file, function(err, stats) {
+ if (err) {
+ return console.log(err)
+ }
+ minioClient.putObject('mybucket', '40mbfile', fileStream, stats.size, function(err, etag) {
+ return console.log(err, etag) // err should be null
+ })
+})
+```
+
+##### 从"Buffer"或者"string"上传
+
+__参数__
+
+
+| 参数 | 类型 | 描述 |
+|---|---|---|
+| `bucketName` |_string_ | 存储桶名称。 |
+| `objectName` |_string_ | 对象名称。 |
+|`string or Buffer` | _Stream_ or _Buffer_ |字符串可者缓冲区 |
+| `contentType` | _string_ | 对象的Content-Type(可选,默认是`application/octet-stream`)。 |
+| `callback(err, etag)` | _function_ |如果`err`不是null则代表有错误,`etag` _string_是上传的对象的etag值。 |
+
+
+__示例__
+
+
+```js
+var buffer = 'Hello World'
+minioClient.putObject('mybucket', 'hello-file', buffer, function(err, etag) {
+ return console.log(err, etag) // err should be null
+})
+```
+
+### fPutObject(bucketName, objectName, filePath, contentType[, callback])
+
+上传文件。
+
+__参数__
+
+
+| 参数 | 类型 | 描述 |
+|---|---|---|
+| `bucketName` | _string_ | 存储桶名称。 |
+|`objectName` |_string_ | 对象名称。 |
+| `filePath` | _string_ | 要上传的文件路径。 |
+| `contentType` | _string_ | 对象的Content-Type。 |
+| `callback(err, etag)` | _function_ | 如果`err`不是null则代表有错误,`etag` _string_是上传的对象的etag值。如果没有传callback的话,则返回一个`Promise`对象。 |
+
+__示例__
+
+
+```js
+var file = '/tmp/40mbfile'
+minioClient.fPutObject('mybucket', '40mbfile', file, 'application/octet-stream', function(err, etag) {
+ return console.log(err, etag) // err should be null
+})
+```
+
+
+### copyObject(bucketName, objectName, sourceObject, conditions[, callback])
+
+将源对象拷贝到指定存储桶的新对象中。
+
+__参数__
+
+
+| 参数 | 类型 | 描述 |
+|---|---|---|
+| `bucketName` | _string_ | 存储桶名称。 |
+|`objectName` |_string_ | 对象名称。 |
+| `sourceObject` | _string_ | 源对象的名称 |
+| `conditions` | _CopyConditions_ | 允许拷贝需要满足的条件。 |
+| `callback(err, {etag, lastModified})` | _function_ | 如果`err`不是null则代表有错误,`etag` _string_是上传的对象的etag值,lastModified _Date_是新拷贝对象的最后修改时间。如果没有传callback的话,则返回一个`Promise`对象。 |
+
+__示例__
+
+```js
+var conds = new Minio.CopyConditions()
+conds.setMatchETag('bd891862ea3e22c93ed53a098218791d')
+minioClient.copyObject('mybucket', 'newobject', '/mybucket/srcobject', conds, function(e, data) {
+ if (e) {
+ return console.log(e)
+ }
+ console.log("Successfully copied the object:")
+ console.log("etag = " + data.etag + ", lastModified = " + data.lastModified)
+})
+```
+
+
+
+### statObject(bucketName, objectName[, callback])
+
+获取对象的元数据。
+
+__参数__
+
+
+| 参数 | 类型 | 描述 |
+|---|---|---|
+| `bucketName` | _string_ | 存储桶名称。 |
+| `objectName` | _string_ | 对象名称。 |
+| `callback(err, stat)` | _function_ |如果`err`不是null则代表有错误,`stat`含有对象的元数据信息,格式如下所示。如果没有传callback的话,则返回一个`Promise`对象。 |
+
+
+
+| 参数 | 类型 | 描述 |
+|---|---|---|
+| `stat.size` | _number_ | 对象的大小。 |
+| `stat.etag` | _string_ | 对象的etag值。 |
+| `stat.contentType` | _string_ | 对象的Content-Type。|
+| `stat.lastModified` | _string_ | Last 最后修改时间。|
+
+
+__示例__
+
+
+```js
+minioClient.statObject('mybucket', 'photo.jpg', function(err, stat) {
+ if (err) {
+ return console.log(err)
+ }
+ console.log(stat)
+})
+```
+
+
+### removeObject(bucketName, objectName[, callback])
+
+删除一个对象。
+
+__参数__
+
+
+| 参数 | 类型 | 描述 |
+|---|---|---|
+|`bucketName` | _string_ | 存储桶名称。 |
+| objectName | _string_ | 对象名称。 |
+| `callback(err)` | _function_ | 如果`err`不是null则代表有错误。如果没有传callback的话,则返回一个`Promise`对象。 |
+
+
+__示例__
+
+
+```js
+minioClient.removeObject('mybucket', 'photo.jpg', function(err) {
+ if (err) {
+ return console.log('Unable to remove object', err)
+ }
+ console.log('Removed the object')
+})
+```
+
+
+### removeIncompleteUpload(bucketName, objectName[, callback])
+
+删除一个未完整上传的对象。
+
+__参数__
+
+
+| 参数 | 类型 | 描述 |
+|---|---|---|
+| `bucketName` |_string_ | 存储桶名称。 |
+| `objectName` | _string_ | 对象名称。 |
+| `callback(err)` | _function_ |如果`err`不是null则代表有错误。如果没有传callback的话,则返回一个`Promise`对象。 |
+
+
+__示例__
+
+
+```js
+minioClient.removeIncompleteUpload('mybucket', 'photo.jpg', function(err) {
+ if (err) {
+ return console.log('Unable to remove incomplete object', err)
+ }
+ console.log('Incomplete object removed successfully.')
+})
+```
+
+## 4. Presigned操作
+
+Presigned URLs用于对私有对象提供临时的上传/下载功能。
+
+
+### presignedUrl(httpMethod, bucketName, objectName, expiry[, reqParams, cb])
+
+生成一个给指定HTTP方法('httpMethod')请求用的presigned URL。浏览器/移动端的客户端可以用这个URL进行下载,即使其所在的存储桶是私有的。这个presigned URL可以设置一个失效时间,默认值是7天。
+
+
+__参数__
+
+
+
+|参数 | 类型 | 描述 |
+|---|---|---|
+|`httpMethod` | _string_ | http方法,put、get等。 |
+|`bucketName` | _string_ | 存储桶名称。 |
+|`objectName` | _string_ | 对象名称。 |
+|`expiry` | _number_ | 失效时间(以秒为单位),默认是7天,不得大于七天。 |
+|`reqParams` | _object_ | 请求参数。 |
+|`callback(err, presignedUrl)` | _function_ | 如果`err`不是null则代表有错误。`presignedUrl`就是可临时上传/下载文件的URL。如果没有传callback的话,则返回一个`Promise`对象。 |
+
+
+__示例1__
+
+
+```js
+// presigned url for 'getObject' method.
+// expires in a day.
+minioClient.presignedUrl('GET', 'mybucket', 'hello.txt', 24*60*60, function(err, presignedUrl) {
+ if (err) return console.log(err)
+ console.log(presignedUrl)
+})
+```
+
+
+__示例2__
+
+
+```js
+// presigned url for 'listObject' method.
+// Lists objects in 'myBucket' with prefix 'data'.
+// Lists max 1000 of them.
+minioClient.presignedUrl('GET', 'mybucket', '', 1000, {'prefix': 'data', 'max-keys': 1000}, function(err, presignedUrl) {
+ if (err) return console.log(err)
+ console.log(presignedUrl)
+})
+```
+
+
+### presignedGetObject(bucketName, objectName, expiry[, cb])
+
+生成一个给HTTP GET请求用的presigned URL。浏览器/移动端的客户端可以用这个URL进行下载,即使其所在的存储桶是私有的。这个presigned URL可以设置一个失效时间,默认值是7天。
+
+
+__参数__
+
+
+
+| 参数 | 类型 | 描述 |
+|---|---|---|
+|`bucketName` | _string_ | 存储桶名称。 |
+|`objectName` | _string_ | 对象名称。 |
+|`expiry` | _number_ | 失效时间(以秒为单位),默认是7天,不得大于七天。 |
+|`callback(err, presignedUrl)` | _function_ | 如果`err`不是null则代表有错误。`presignedUrl`就是可用于临时下载的URL。 如果没有传callback的话,则返回一个`Promise`对象。 |
+
+
+__示例__
+
+
+```js
+// expires in a day.
+minioClient.presignedGetObject('mybucket', 'hello.txt', 24*60*60, function(err, presignedUrl) {
+ if (err) return console.log(err)
+ console.log(presignedUrl)
+})
+```
+
+
+### presignedPutObject(bucketName, objectName, expiry[, callback])
+
+生成一个给HTTP PUT请求用的presigned URL。浏览器/移动端的客户端可以用这个URL进行上传,即使其所在的存储桶是私有的。这个presigned URL可以设置一个失效时间,默认值是7天。
+
+
+__参数__
+
+
+| 参数 | 类型 | 描述 |
+|---|---|---|
+|`bucketName` | _string_ | 存储桶名称。 |
+|`objectName` | _string_ | 对象名称。 |
+|`expiry` | _number_ | 失效时间(以秒为单位),默认是7天,不得大于七天。 |
+|`callback(err, presignedUrl)` | _function_ | 如果`err`不是null则代表有错误。`presignedUrl`用于使用PUT请求进行上传。如果没有传callback的话,则返回一个`Promise`对象。 |
+
+
+__示例__
+
+
+```js
+// expires in a day.
+minioClient.presignedPutObject('mybucket', 'hello.txt', 24*60*60, function(err, presignedUrl) {
+ if (err) return console.log(err)
+ console.log(presignedUrl)
+})
+```
+
+
+### presignedPostPolicy(policy[, callback])
+
+允许给POST请求的presigned URL设置条件策略。比如接收上传的存储桶名称、名称前缀、过期策略。
+
+__参数__
+
+
+| 参数 | 类型 | 描述 |
+|---|---|---|
+| `policy` | _object_ | 通过minioClient.newPostPolicy()创建的Policy对象。 |
+| `callback(err, postURL, formData)` | _function_ |如果`err`不是null则代表有错误。`postURL`用于使用post请求上传。`formData`是POST请求体中的键值对对象。如果没有传callback的话,则返回一个`Promise`对象。 |
+
+
+创建策略:
+
+
+```js
+var policy = minioClient.newPostPolicy()
+```
+
+设置上传策略:
+
+```js
+// Policy restricted only for bucket 'mybucket'.
+policy.setBucket('mybucket')
+
+// Policy restricted only for hello.txt object.
+policy.setKey('hello.txt')
+```
+或者
+
+```js
+// Policy restricted for incoming objects with keyPrefix.
+policy.setKeyStartsWith('keyPrefix')
+
+var expires = new Date
+expires.setSeconds(24 * 60 * 60 * 10)
+// Policy expires in 10 days.
+policy.setExpires(expires)
+
+// Only allow 'text'.
+policy.setContentType('text/plain')
+
+// Only allow content size in range 1KB to 1MB.
+policy.setContentLengthRange(1024, 1024*1024)
+```
+
+使用`superagent`通过浏览器POST你的数据:
+
+
+```js
+minioClient.presignedPostPolicy(policy, function(err, postURL, formData) {
+ if (err) return console.log(err)
+
+ var req = superagent.post(postURL)
+ _.each(formData, function(value, key) {
+ req.field(key, value)
+ })
+
+ // file contents.
+ req.attach('file', '/path/to/hello.txt', 'hello.txt')
+
+ req.end(function(err, res) {
+ if (err) {
+ return console.log(err.toString())
+ }
+ console.log('Upload successful.')
+ })
+})
+```
+
+## 5. 存储桶策略/通知
+
+存储桶可以配置在指定事件类型和相应路径上触发通知。
+
+
+### getBucketNotification(bucketName[, cb])
+
+获取指定存储桶名称的通知配置。
+
+__参数__
+
+
+
+| 参数 | 类型 | 描述 |
+|---|---|---|
+| `bucketName` | _string_ | 存储桶名称。 |
+| `callback(err, bucketNotificationConfig)` | _function_ | 如果`err`不是null则代表有错误。`bucketNotificationConfig`是相应存储桶上的通知配置对象。如果没有传callback的话,则返回一个`Promise`对象。 |
+
+
+__示例__
+
+
+```js
+minioClient.getBucketNotification('mybucket', function(err, bucketNotificationConfig) {
+ if (err) return console.log(err)
+ console.log(bucketNotificationConfig)
+})
+```
+
+
+### setBucketNotification(bucketName, bucketNotificationConfig[, callback])
+
+上传一个用户创建的通知配置,并绑定到指定的存储桶上。
+
+
+__参数__
+
+
+| 参数 | 类型 | 描述 |
+|---|---|---|
+| `bucketName` | _string_ | 存储桶名称。 |
+| `bucketNotificationConfig` | _BucketNotification_ | 包含通知配置的Javascript对象。 |
+| `callback(err)` | _function_ | 如果`err`不是null则代表有错误。如果没有传callback的话,则返回一个`Promise`对象。 |
+
+
+__示例__
+
+```js
+// Create a new notification object
+var bucketNotification = new Notify.BucketNotification();
+
+// Setup a new topic configuration
+var arn = Notify.newARN('aws', 'sns', 'us-west-2', '408065449417', 'TestTopic')
+var topic = new Notify.TopicConfig(arn)
+topic.addFilterSuffix('.jpg')
+topic.addFilterPrefix('myphotos/')
+topic.addEvent(Notify.ObjectReducedRedundancyLostObject)
+topic.addEvent(Notify.ObjectCreatedAll)
+
+// Add the topic to the overall notification object
+bucketNotification.addTopicConfiguration(topic)
+
+minioClient.setBucketNotification('mybucket', bucketNotification, function(err) {
+ if (err) return console.log(err)
+ console.log('Success')
+})
+```
+
+
+### removeAllBucketNotification(bucketName[, callback])
+
+删除指定存储桶上的通知配置。
+
+__参数__
+
+
+| 参数 | 类型 | 描述 |
+|---|---|---|
+| `bucketName` | _string_ | 存储桶名称。 |
+| `callback(err)` | _function_ | 如果`err`不是null则代表有错误。如果没有传callback的话,则返回一个`Promise`对象。 |
+
+
+```js
+minioClient.removeAllBucketNotification('my-bucketname', function(e) {
+ if (e) {
+ return console.log(e)
+ }
+ console.log("True")
+})
+```
+
+
+### listenBucketNotification(bucketName, prefix, suffix, events)
+
+监听存储桶上的通知,可通过前缀、后缀、事件类型进行过滤。使用本API并不需要预先设置存储桶通知。这是Minio的一个扩展API,服务端基于过来的请求使用唯一ID自动注册或者取消注册。
+
+返回一个`EventEmitter`对象,它可以广播一个`通知`事件。
+
+停止监听,调用`EventEmitter`的`stop()`方法。
+
+__参数__
+
+| 参数 | 类型 | 描述 |
+|---|---|---|
+| `bucketName` | _string_ | 存储桶名称。 |
+| `prefix` | _string_ | 用于过滤通知的对象名称前缀。 |
+| `suffix` | _string_ | 用于过滤通知的对象名称后缀。 |
+| `events` | _Array_ | 在指定事件类型上开启通知。 |
+
+这里是你要的[完整示例](https://github.com/minio/minio-js/blob/master/examples/minio/listen-bucket-notification.js),拿走不谢。
+
+```js
+var listener = minioClient.listenBucketNotification('my-bucketname', 'photos/', '.jpg', ['s3:ObjectCreated:*'])
+listener.on('notification', function(record) {
+ // For example: 's3:ObjectCreated:Put event occurred (2016-08-23T18:26:07.214Z)'
+ console.log('%s event occurred (%s)', record.eventName, record.eventTime)
+ listener.stop()
+})
+```
+
+
+### getBucketPolicy(bucketName, objectPrefix[, callback])
+
+获取指定存储桶的访问策略,如果`objectPrefix`不为空,则会取相应对象前缀上的访问策略。
+
+__参数__
+
+
+| 参数 | 类型 | 描述 |
+|---|---|---|
+| `bucketName` | _string_ | 存储桶名称。 |
+| `objectPrefix` | _string_ | 用于过滤的对象前缀,`''`代表整个存储桶。 |
+| `callback(err, policy)` | _function_ | 如果`err`不是null则代表有错误。`policy`是存储桶策略的字符串表示(`minio.Policy.NONE`,`minio.Policy.READONLY`,`minio.Policy.WRITEONLY`,或者`minio.Policy.READWRITE`). 如果没有传callback的话,则返回一个`Promise`对象。 |
+
+
+```js
+// Retrieve bucket policy of 'my-bucketname' that applies to all objects that
+// start with 'img-'.
+minioClient.getBucketPolicy('my-bucketname', 'img-', function(err, policy) {
+ if (err) throw err
+
+ console.log(`Bucket policy: ${policy}`)
+})
+```
+
+
+### setBucketPolicy(bucketName, objectPrefix, bucketPolicy[, callback])
+
+设置指定存储桶的策略。如果`objectPrefix`不为空,则会给符合该前缀的对象(们)设置策略。
+
+__参数__
+
+
+| 参数 | 类型 | 描述 |
+|---|---|---|
+| `bucketName` | _string_ | 存储桶名称。 |
+| `objectPrefix` | _string_ | 要设置访问策略的对象前缀。`''`代表整个存储桶。 |
+| `bucketPolicy` | _string_ | 存储桶策略。可选值有:`minio.Policy.NONE`,`minio.Policy.READONLY`,`minio.Policy.WRITEONLY`或者`minio.Policy.READWRITE`。 |
+| `callback(err)` | _function_ | 如果`err`不是null则代表有错误。如果没有传callback的话,则返回一个`Promise`对象。 |
+
+
+```js
+// Set the bucket policy of `my-bucketname` to `readonly` (only allow retrieval),
+// but only for objects that start with 'img-'.
+minioClient.setBucketPolicy('my-bucketname', 'img-', minio.Policy.READONLY, function(err) {
+ if (err) throw err
+
+ console.log('Set bucket policy to \'readonly\'.')
+})
+```
+
+
+## 6. 了解更多
+
+
+- [创建属于你的购物APP示例](https://docs.minio.io/docs/javascript-shopping-app)
diff --git a/docs/zh_CN/CONTRIBUTING.md b/docs/zh_CN/CONTRIBUTING.md
new file mode 100644
index 00000000..7e890548
--- /dev/null
+++ b/docs/zh_CN/CONTRIBUTING.md
@@ -0,0 +1,23 @@
+### 设置你的minio-js Github仓库
+Fork [minio-js upstream](https://github.com/minio/minio-js/fork) 源码仓库到你的个人仓库。
+
+Minio Javascript使用[gulp](http://gulpjs.com/)来管理它的依赖。
+
+```bash
+$ git clone https://github.com/$USER_ID/minio-js
+$ cd minio-js
+$ npm install
+$ gulp
+...
+```
+
+### 开发者指南
+
+``minio-js`` 欢迎各位有识之士贡献自己的力量。为了让大家配合起来更默契,我们做出如下约定:
+
+* fork项目并修改,我们鼓励大家进行pull request。
+ - Fork项目
+ - 创建你的特性分支 (git checkout -b my-new-feature)
+ - Commit你的修改(git commit -am 'Add some feature')
+ - Push到远程分支(git push origin my-new-feature)
+ - 创建一个Pull Request