sql >> データベース >  >> NoSQL >> MongoDB

blobからbinaryに変換して、mongodbに保存します

    ですから、あなたの問題はこの行にあると思います:

    new_project.picture.data = fs.readFileSync(req.body.picture[0]);
    

    そして、dataを挿入しているのはmongoDBテーブル列です。 その中にあなたにそのエラーを与えています。文字列またはバッファが必要であり、Fileオブジェクトを指定しました。

    ここに投稿したもの 、以下のコードと統合してみます:

    ファイルを収集するための変数があることを確認する必要があります。これが私のページの上部を設定する方法です:

    import React from 'react'
    import Reflux from 'reflux'
    import {Form, Card, CardBlock, CardHeader, CardText, Col, Row, Button } from 'reactstrap'
    import actions from '~/actions/actions'
    import DropZone from 'react-dropzone'
    
    // stores
    import SomeStore from '~/stores/someStore.jsx'
    
    Reflux.defineReact(React)
    export default class myUploaderClass extends Reflux.Component {
      constructor(props) {
        super(props);
        this.state = {
            attachments: [],
        };
        this.stores = [
            SomeStore,
        ]
        ....
    

    次に、新しい関数をバインドします:

        ....
        this.getData = this.getData.bind(this);
        this.processFile = this.processFile.bind(this);
        this.errorHandler = this.errorHandler.bind(this);
        this.progressHandler = this.progressHandler.bind(this);
      } // close constructor
    

    次に、attachmentsにバイトを提供する作業を行います それをnew_project.picture.dataに送信します 。私の場合、onDropを実行する関数を使用します onDrop={this.uploadFile}を使用したDropZoneの 。 filesToUploadがわからないため、あなたが何をしているのかよくわかりません。 を指します。私のuploadFile 次のようになります:

    uploadFile(event){
      this.setState({
        files: event,
      });
    
      document.getElementById('docDZ').classList.remove('dragover');
      document.getElementById('progress').textContent = '000';
      document.getElementById('progressBar').style.width = '0%';
    
      this.state.files = event;  // just for good measure
      for (let i = 0; i < this.state.files.length; i++) {
        const a = i + 1;
        console.log('in loop, pass: ' + a);
        const f = this.state.files[i];
    
        this.getData(f); // this will load the file to SomeStore.state.attachments
      }
    }
    

    これはgetDataになります DropZoneにドロップ/追加されたファイルごとに関数が実行されました:

    getData(f) {
        const reader = new FileReader();
        reader.onerror = this.errorHandler;
        reader.onprogress = this.progressHandler;
        reader.onload = this.processFile(f);
        reader.readAsDataURL(f);
    }
    

    次に、processFile() onloadから 実行:

    processFile(theFile) {
      return function(e) {
        const bytes = e.target.result.split('base64,')[1];
        const fileArray = [];
    
        // *** Collect any existing attachments ***
        // I found I could not get it from this.state, but had to use
        // my store, instead
        if (SomeStore.state.attachments.length > 0) {
          for (let i=0; i < SomeStore.state.attachments.length; i++) {
            fileArray.push(SomeStore.state.attachments[i]);
         }
        }
    
        // Add the new one to this.state
        fileArray.push(bytes);
    
        // Update the state
        SomeStore.setState({
          attachments: fileArray,
        });
        // This seemed to automatically add it to this.state, for me.
      }
    }
    

    それができたら、次のことができるようになります。

    new_project.picture.data = this.state.attachments[0];
    

    そうでない場合は、何らかの理由で、これをexports.create_a_project()内で呼び出そうとする可能性があります。 、最初に行うこととして:

    getData(req.body.picture[0]);
    

    これは、onDropを変更しなくても機能する可能性があります あなたが持っているものからのルーチン。そして、this.state.attachments 何もありません、あなたのSomeStore.state.attachments これをstoresというフォルダに保存していると仮定すると、間違いなく必要です。 someStore.jsxとして 。

    import Reflux from 'reflux'
    import Actions from '~/actions/actions`
    
    class SomeStore extends Reflux.Store
    {
        constructor()
        {
            super();
            this.state = {
                attachments: [],
            };
            this.listenables = Actions;
            this.baseState = {
                attachments: [],
            };
        }
    
        onUpdateFields(name, value) {
            this.setState({
                [name]: value,
            });
        }
    
        onResetFields() {
            this.setState({
               attachments: [],
            });
        }
    }
    const reqformdata = new SomeStore
    
    export default reqformdata
    

    追加機能

    errorHandler(e){
        switch (e.target.error.code) {
          case e.target.error.NOT_FOUND_ERR:
            alert('File not found.');
            break;
          case e.target.error.NOT_READABLE_ERR:
            alert('File is not readable.');
            break;
          case e.target.error.ABORT_ERR:
            break;    // no operation
          default:
            alert('An error occurred reading this file.');
            break;
        }
      }
    
    progressHandler(e) {
        if (e.lengthComputable){
          const loaded = Math.round((e.loaded / e.total) * 100);
          let zeros = '';
    
          // Percent loaded in string
          if (loaded >= 0 && loaded < 10) {
            zeros = '00';
          }
          else if (loaded < 100) {
            zeros = '0';
          }
    
          // Display progress in 3-digits and increase bar length
          document.getElementById("progress").textContent = zeros + loaded.toString();
          document.getElementById("progressBar").style.width = loaded + '%';
        }
      }
    

    そして、私のDropZoneと該当する進行状況インジケーターのマークアップ:

    render(){
    
    const dropZoneStyle = {
      height: "34px",
      width: "300px",
      border: "1px solid #ccc",
      borderRadius: "4px",
    };
    
    return (
      <Form>
        <Col xs={5}>
                <DropZone type="file" id="docDZ"
                  onDrop={this.uploadFile}
                  onDropRejected={this.onDropRejected}
                  onClick={this.handleUploadClick}
                  onChange={this.handleChange}
                  onDragEnter={this.handleDragEnter}
                  onDragLeave={this.handleDragLeave}
                  accept=".doc, .docx, .gif, .png, .jpg, .jpeg, .pdf"
                  multiple="true"
                  maxSize={999000}
                  style={dropZoneStyle}>
                   {'Click HERE to upload or drop files here...'}
                </DropZone>
                <table id="tblProgress">
                  <tbody>
                    <tr>
                      <td><b><span id="progress">000</span>%</b> <span className="progressBar"><span id="progressBar" /></span></td>
                    </tr>
                  </tbody>
                </table>
              </Col>
          </Row>
        </Form>
        )
      } // close render
    }  // close class
    

    そしてCSS:

    .progressBar {
      background-color: rgba(255, 255, 255, .1);
      width: 100%;
      height: 26px;
    }
    #progressBar {
      background-color: rgba(87, 184, 208, .5);
      content: '';
      width: 0;
      height: 26px;
    }
    

    不足しているその他の機能:

    handleUploadClick(){
      return this.state;
    }
    
    handleChange(){
      this.state.errors.fileError = "";
    }
    
    handleDragEnter(event){
      event.preventDefault();
      document.getElementById("docDZ").classList.add("dragover");
    }
    
    handleDragLeave(event){
      event.preventDefault();
      document.getElementById("docDZ").classList.remove("dragover");
    }
    
    onDropRejected(files){
        const errors ={}
        let isAlertVisible = false;
    
        for(let i=0, j = files.length; i < j; i++){
          const file = files[i];
          const ext = file.name.split('.').pop().toLowerCase();
          //console.log(ext)
    
         if(this.isFileTypeValid(ext)===false){
            errors.fileError = "Only image files (JPG, GIF, PNG), Word files (DOC, DOCX), and PDF files are allowed.";
            isAlertVisible = true;
         }
    
         if(ext === "docx" || ext ==="gif" || ext ==="png" || ext ==="jpg" || ext ==="jpeg" || ext ==="pdf" || ext ==="doc" && file.size > 999000){
          errors.fileError = "Exceeded File Size limit! The maximum file size for uploads is 999 KB.";
          isAlertVisible = true;
        }
    
        this.setState({
          "errors": errors,
          "isAlertVisible": isAlertVisible,
        })
      }
    }
    



    1. 各ノードのすべての子ノードのサブノードをカウントするには、mongo集約ルックアップに関するガイダンスが必要です

    2. Herokuカスタムドメインが機能しない

    3. Mongoose Node.jsの参照を考慮してオブジェクトを削除するにはどうすればよいですか?

    4. Elasticsearchは、再起動するまですべての検索リクエストでタイムアウトします