1

したがって、基本的には、ユーザーが登録時に画像をアップロードできるようにしたいと考えています。永遠にどこから始めればよいかわかりません。CouchDB が添付ファイルをサポートしていることは知っていますが、Cradle ではどのように機能するのでしょうか。

Cradleのドキュメントで次のコードを見つけました

saveAttachment: function (/* id, [rev], attachmentName, contentType, dataOrStream */) {

だから私はそれが添付ファイルを保存できることを知っています。その場合、どのように画像を渡しますか?私はhtmlで、私は使用しなければならないと仮定しています

form(action='/upload', enctype='multipart/form-data', method='post')
input(type='file', name='upload')
input(type='submit', value='Upload')

しかし、そこからどこへ行くのですか?この手順では、画像をサーバーのどこかに保存しませんか。次に、何らかの方法で画像のアドレスを取得し、それをクレードルに渡して、CouchDB データベースに添付ファイルとして保存する必要がありますか。

あなたが私を助けることができるなら、事前に感謝します!

4

3 に答える 3

2

フォームから受信ストリームを取得し、Cradle経由でストリームを CouchDB に送信する必要があります。

ストリームを Cradle に送信するのはおそらく簡単です。この例は、ローカル ファイルを使用してそれを行う方法を示しています。

db.saveAttachment( 
    doc.id, 
    doc.rev, 
    attachmentId,
    mimetype, 
    fs.createReadStream(path),
    function( err, data ){
        console.log(data);
    }
);

私の意見では、ややこしいのは受信ファイルの管理です。ファイルに保存されるのではなく、マルチパート ストリームとして到着します。Connect または Express を使用している場合は、直接、またはconnect-formを介して間接的に、そのコードをformidableに外部委託することをお勧めします。

現在の接続フォーム コードは、次のように要約できます。

req.form.complete(function(err, fields, files){
    if ( err ) // handle err
    else
    {
        db.saveAttachment( 
            doc.id, 
            doc.rev, 
            attachmentId,
            mimetype, 
            fs.createReadStream(files.name),
            function( err, data ){
                console.log(data);
            }
        );
    }
});

これは、ある場所から別の場所にデータをストリーミングするのではなく、ディスク上に実際のファイルを作成するため、速度には最適ではありませんが、便利であり、多くのユース ケースを満たすことができます。

画像のアップロードを扱う場合に知っておくべきもう 1 つのパッケージは、node-imagemagickです。これは、名前から想像できるように、ImageMagick の node.js ラッパーです。

于 2011-05-22T14:07:09.827 に答える
1

クレードルの readme にまもなく統合されることを願って、添付ファイルに関するいくつかのドキュメントを作成しました。今のところ、ここに関連するセクションがあります

付属品

クレードルは、添付ファイルの書き込み、読み取り、および削除をサポートしています。読み取りおよび書き込み操作は、バッファリングまたはストリーミングのいずれかです。

書き込み

添付ファイルの本文全体をバッファリングして、1 つの要求として一度に送信できます。添付ファイルのアップロードが完了するか、エラーが発生すると、コールバック関数が起動します

構文

db.saveAttachment(idData, attachmentData, callbackFunction)

「fooAttachment.txt」という名前と「Foo document text」という内容の添付ファイルとしてテキスト ドキュメントを保存するとします。

var doc = <some existing document>
var id = doc._id
var rev = doc._rev
var idAndRevData = {
  id: id,
  rev: rev
}
var attachmentData = {
  name: 'fooAttachment.txt',
  'Content-Type': 'text/plain',
  body: 'Foo document text'
}
db.saveAttachment(idAndRevData, attachmentData, function (err, reply) {
  if (err) {
    console.dir(err)
    return
  }
  console.dir(reply)
})

ストリーミング

最初に本文全体をバッファリングするのではなく、読み取りストリームを使用して添付ファイルの本文をアップロードできます。ストリーミング アップロードが完了するか、エラーが発生すると、コールバック関数が起動します。

構文

var doc = savedDoc // <some saved couchdb document which has an attachment>
var id = doc._id
var rev = doc._rev
var idAndRevData = {
  id: id,
  rev: rev
}
var attachmentData = {
  name: attachmentName               // something like 'foo.txt'
  'Content-Type': attachmentMimeType // something like 'text/plain', 'application/pdf', etc.
  body: rawAttachmentBody            // something like 'foo document body text'
}
var readStream = fs.createReadStream('/path/to/file/')
var writeStream  = db.saveAttachment(idData, attachmentData, callbackFunction)
readStream.pipe(writeStream)

ストリーミングのアップロードが完了すると、コールバック関数が起動します

パス './data/bar.pdf' にある 'bar.pdf' という名前の pdf ファイルを既存のドキュメントに添付します。

var path = require('path')
var fs = require('fs')
// this document should already be saved in the couchdb database
var doc = {
  _id: 'fooDocumentID',
  _rev: 'fooDocumentRev'
}
var idData = {
  id: doc._id,
  rev: doc._rev
}
var filename = 'bar.pdf' // this is the filename that will be used in couchdb. It can be different from your source filename if desired
var filePath = path.join(__dirname, 'data', 'bar.pdf')
var readStream = fs.createReadStream
// note that there is no body field here since we are streaming the upload
var attachmentData = {
  name: 'fooAttachment.txt',
  'Content-Type': 'text/plain'
}
db.saveAttachment(idData, attachmentData, function (err, reply) {
  if (err) {
    console.dir(err)
    return
  }
  console.dir(reply)
}, readStream)

読む

緩衝

添付ファイル全体をバッファリングして、一度に受信できます。ダウンロードが完了するか、エラーが発生すると、コールバック関数が起動します。コールバックの 2 番目のパラメーターは、添付ファイルのバイナリ データです。

構文

db.getAttachment(documentID, attachmentName, callbackFunction)

「foo.txt」という名前で保存された添付ファイルを読み返したいとします。

var doc = <some saved document that has an attachment with name *foo.txt*>
var id = doc._id
var attachmentName = 'foo.txt'
db.getAttachment(id, attachmentName, function (err, reply) {
  if (err) {
    console.dir(err)
    return
  }
  console.dir(reply)
})

ストリーミング

添付ファイルもストリーミングできます。添付ファイルが大きい場合、メモリ消費を制限するためにストリーミングすると便利です。ダウンロード ストリームが完了すると、コールバック関数が起動します。コールバック関数に渡されるエラー パラメータは 1 つだけであることに注意してください。error は null で、エラーが発生していないか、添付ファイルのダウンロード中にエラーが発生した場合はエラー オブジェクトです。バッファリングされた読み取りの例のように、添付データを含む 2 番目のパラメータはありません

構文

var readStream = db.getAttachment(documentID, attachmentName, callbackFunction)

「foo.txt」という名前で保存された添付ファイルを読み返したいとします。ただし、添付ファイル foo.txt は非常に大きいため、ファイル全体をメモリにバッファリングするのではなく、ディスクにストリーミングする必要があります。

var doc = <some saved document that has an attachment with name *foo.txt*>
var id = doc._id
var attachmentName = 'foo.txt'
var downloadPath = path.join(__dirname, 'foo_download.txt')
var writeStream = fs.createWriteStream(downloadPath)
var readStream = db.getAttachment('piped-attachment', 'foo.txt', function (err) { // note no second reply paramter
  if (err) {
    console.dir(err)
    return
  }
  console.dir('download completed and written to file on disk at path', downloadPath)
})
readStream.pipe(writeStream)

削除する

_id と添付ファイル名を使用して、アップロードされた添付ファイルを削除できます

構文

db.removeAttachment(documentID, attachmentName, callbackFunction)

「foo.txt」という名前で保存された添付ファイルを削除したいとします。

var doc = <some saved document that has an attachment with name *foo.txt*>
var id = doc._id
var attachmentName = 'foo.txt'
db.removeAttachment(id, attachmentName, function (err, reply) {
  if (err) {
    console.dir(err)
    return
  }
  console.dir(reply)
})
于 2013-03-20T17:40:50.853 に答える
1

参考までに、将来の読者のために、呼び出しパラメーターはそれ以来変更されているため、これはもはや有効ではないようです。ドキュメントには使用方法が記載されていないため、ソースを確認してください。

于 2013-03-05T21:38:15.157 に答える