ReactJS : 업로드 전에 여러 이미지 미리보기

이스라엘 Obanijesu

ReactJS와 FileReader()API를 사용하여 서버에 업로드하기 전에 브라우저에서 여러 이미지를 미리 보려고합니다 . 내가 가진 문제는 미리보기를 위해 일부 이미지를 선택할 때마다 마지막 이미지 만 표시된다는 것입니다.

내 코드는 다음과 같습니다.

class App extends Component {
    constructor(props){
        super(props);
        this.state = {
            id: "upload-photo",
            imageURI: null
        }
    }

    buildImgTag(){
        let imgTag = null;
        if (this.state.imageURI !== null) {
            imgTag = (
                <div className="photo-container">
                    <img className="photo-uploaded" src={this.state.imageURI} alt="Photo uploaded"/>
                </div>
            );
            return imgTag;
        }
    }

    readURI(e){
        if (e.target.files) {
            let filesAmount = e.target.files.length;
            let i;
            for (i = 0; i < filesAmount; i++) {
                let reader = new FileReader();
                reader.onload = function(ev) {
                    this.setState (
                        {
                            imageURI: ev.target.result
                        }
                    )
                }.bind(this);
                reader.readAsDataURL(e.target.files[i]);
            }
        }
    }

    handleChange(e){
        this.readURI(e);
        if (this.props.onChange !== undefined) {
            this.props.onChange(e);
        }
    }

    render() {
        const imgTag = this.buildImgTag();

        return (
            <div className="container">
                <div className="row justify-content-center">

                    <div className="col-md-6">
                        <div className="card">
                            <div className="card-header" style={{backgroundColor: 'rgb(232, 245, 253)', borderTopLeftRadius: '4px', borderTopRightRadius: '4px', display: 'flex', maxHeight: '50vh', minHeight: '25vh', overflow: 'hidden'}}>
                                <div className="avatar">
                                    <img src="http://laratweet.local:8080/images/avatar-default.png" alt="User Avatar" className="user-avatar"/>
                                </div>
                                <div id="textEditor">
                                    <form method="post" action="" encType="multipart/form-data">
                                        <textarea name="" id="richTextArea" placeholder="What's happening?"></textarea>
                                        {imgTag}
                                        <div id="theRibbon">
                                            <div>
                                                <input
                                                    id={this.state.id}
                                                    type="file"
                                                    name=""
                                                    accept="image/gif,image/jpeg,image/jpg,image/png,video/mp4,video/x-m4v"
                                                    title="Add photos or video"
                                                    onChange={this.handleChange.bind(this)}
                                                    multiple
                                                />
                                                <label htmlFor={this.state.id}>
                                                    <figure>
                                                        <svg xmlns="http://www.w3.org/2000/svg" width="30" height="27"
                                                             viewBox="0 0 20 17" className="upload-icon">
                                                            <path
                                                                d="M10 0l-5.2 4.9h3.3v5.1h3.8v-5.1h3.3l-5.2-4.9zm9.3 11.5l-3.2-2.1h-2l3.4 2.6h-3.5c-.1 0-.2.1-.2.1l-.8 2.3h-6l-.8-2.2c-.1-.1-.1-.2-.2-.2h-3.6l3.4-2.6h-2l-3.2 2.1c-.4.3-.7 1-.6 1.5l.6 3.1c.1.5.7.9 1.2.9h16.3c.6 0 1.1-.4 1.3-.9l.6-3.1c.1-.5-.2-1.2-.7-1.5z"/>
                                                        </svg>
                                                    </figure>
                                                    <span className="tooltiptext">Add photos or video</span>
                                                </label>
                                            </div>
                                            <button type="submit" className="tweet">Tweet</button>
                                        </div>
                                    </form>
                                </div>
                            </div>
                        </div>
                    </div>
                </div>
            </div>
        );
    }
}

선택한 모든 이미지가 브라우저에 표시 / 미리보기를 기대하지만 마지막 이미지 만 미리보기됩니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?

Dacre Denny

여기서 주된 문제는 App구성 요소 상태가 현재 하나만 추적 할 수 있다는 것 imageURI입니다. state의 배열을 imageURI저장하고 렌더링 할 수 있도록 모델을 수정하는 것이 좋습니다.

this.state = {
    id: "upload-photo",
    imageArray: [] /* Replace imageURI with an array for multiple images */
}

다음으로 readURI()구성 요소 상태에 여러 이미지를 저장 하도록 업데이트해야합니다 . 한 가지 방법은 Promise.all()이미지 배열을 비동기 적으로로드하는 데 사용 하는 것입니다 .

readURI(e){
    if (e.target.files) {

        /* Get files in array form */
        const files = Array.from(e.target.files);

        /* Map each file to a promise that resolves to an array of image URI's */ 
        Promise.all(files.map(file => {
            return (new Promise((resolve,reject) => {
                const reader = new FileReader();
                reader.addEventListener('load', (ev) => {
                    resolve(ev.target.result);
                });
                reader.addEventListener('error', reject);
                reader.readAsDataURL(file);
            }));
        }))
        .then(images => {

            /* Once all promises are resolved, update state with image URI array */
            this.setState({ imageArray : images })

        }, error => {        
            console.error(error);
        });
    }
}

마지막으로 buildImgTag()여러 이미지가 렌더링되도록 업데이트 하기 만하면 됩니다. 이에 대한 한 가지 접근 방식은 다음과 같습니다.

buildImgTag(){

    return <div className="photo-container">
    { 
      this.state.imageArray.map(imageURI => 
      (<img className="photo-uploaded" src={imageURI} alt="Photo uploaded"/>)) 
    }
    </div>
}

또한 여기 에 파일 읽기 논리가 작동하는 것을 보여주는 jsFiddle 이 있습니다. 도움이되는 희망

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

yii 프레임 워크에서 여러 파일 업로드, 이미지 저장 전에 미리보기 표시

분류에서Dev

여러 이미지 업로드 및 미리보기

분류에서Dev

업로드하기 전에 이미지 미리보기 삭제

분류에서Dev

업로드하기 전에 많은 이미지 미리보기

분류에서Dev

업로드하기 전에 이미지 미리보기 시도

분류에서Dev

업로드 전에 미리보기 이미지 표시

분류에서Dev

vuetify "<v-file-input>"을 사용하여 업로드하기 전에 미리보기 이미지?

분류에서Dev

부트 스트랩 캐 러셀 또는 캐 러셀을 사용하여 업로드하기 전에 VUEJS 미리보기 이미지

분류에서Dev

여러 이미지 배열을 반복하여 AWS s3 ReactJS에 개별적으로 업로드

분류에서Dev

업로드 스크립트 전 jQuery 이미지 미리보기

분류에서Dev

업로드하기 전에 미리보기에서 이미지 선택

분류에서Dev

폰갭에 업로드하기 전에 이미지 미리보기

분류에서Dev

업로드하기 전에 이미지를 미리 보시겠습니까?

분류에서Dev

이미지를 미리보고 업로드하기 전에 자릅니다.

분류에서Dev

둘 이상의 이미지에 대해 업로드하기 전에 미리보기 이미지

분류에서Dev

React 후크를 사용하여 React js에서 업로드 된 이미지 미리보기

분류에서Dev

여러 이미지에 대한 이미지 온로드 기능 처리

분류에서Dev

워드 프레스에서 여러 이미지 업로드

분류에서Dev

미리보기에 여러 이미지 표시

분류에서Dev

Android 앱에서 서버로 여러 이미지 업로드

분류에서Dev

Android에서 PHP로 여러 이미지 업로드

분류에서Dev

미리보기로 여러 이미지 추가

분류에서Dev

PHP : 여러 이미지를 imgur에 한 번에 업로드

분류에서Dev

addThis 플러그인을 사용하여 Pinterest 핀 미리보기 팝업에 숨겨진 이미지 표시

분류에서Dev

이전 이미지를 삭제하여 이미지 업로드

분류에서Dev

제출 버튼을 사용하지 않고 미리보기로 여러 이미지 업로드

분류에서Dev

Django로 여러 이미지 업로드

분류에서Dev

Laravel 8에서 여러 이미지 업로드 문제

분류에서Dev

node.js에서 여러 이미지 업로드 오류

Related 관련 기사

  1. 1

    yii 프레임 워크에서 여러 파일 업로드, 이미지 저장 전에 미리보기 표시

  2. 2

    여러 이미지 업로드 및 미리보기

  3. 3

    업로드하기 전에 이미지 미리보기 삭제

  4. 4

    업로드하기 전에 많은 이미지 미리보기

  5. 5

    업로드하기 전에 이미지 미리보기 시도

  6. 6

    업로드 전에 미리보기 이미지 표시

  7. 7

    vuetify "<v-file-input>"을 사용하여 업로드하기 전에 미리보기 이미지?

  8. 8

    부트 스트랩 캐 러셀 또는 캐 러셀을 사용하여 업로드하기 전에 VUEJS 미리보기 이미지

  9. 9

    여러 이미지 배열을 반복하여 AWS s3 ReactJS에 개별적으로 업로드

  10. 10

    업로드 스크립트 전 jQuery 이미지 미리보기

  11. 11

    업로드하기 전에 미리보기에서 이미지 선택

  12. 12

    폰갭에 업로드하기 전에 이미지 미리보기

  13. 13

    업로드하기 전에 이미지를 미리 보시겠습니까?

  14. 14

    이미지를 미리보고 업로드하기 전에 자릅니다.

  15. 15

    둘 이상의 이미지에 대해 업로드하기 전에 미리보기 이미지

  16. 16

    React 후크를 사용하여 React js에서 업로드 된 이미지 미리보기

  17. 17

    여러 이미지에 대한 이미지 온로드 기능 처리

  18. 18

    워드 프레스에서 여러 이미지 업로드

  19. 19

    미리보기에 여러 이미지 표시

  20. 20

    Android 앱에서 서버로 여러 이미지 업로드

  21. 21

    Android에서 PHP로 여러 이미지 업로드

  22. 22

    미리보기로 여러 이미지 추가

  23. 23

    PHP : 여러 이미지를 imgur에 한 번에 업로드

  24. 24

    addThis 플러그인을 사용하여 Pinterest 핀 미리보기 팝업에 숨겨진 이미지 표시

  25. 25

    이전 이미지를 삭제하여 이미지 업로드

  26. 26

    제출 버튼을 사용하지 않고 미리보기로 여러 이미지 업로드

  27. 27

    Django로 여러 이미지 업로드

  28. 28

    Laravel 8에서 여러 이미지 업로드 문제

  29. 29

    node.js에서 여러 이미지 업로드 오류

뜨겁다태그

보관