프로필 사진 올리기 2

2024. 8. 9. 13:56Springboot-React

Profile.js

import React, { useEffect, useState } from "react";
import axios from "axios";
import '../css/Profile.css';

const Profile = () => {

    const uploadAPI = "http://localhost:9015/profile/upload";
    const watchingAPI = "http://localhost:9015/profile/watching";

    const [files, setFiles] = useState([]);
    const [username, setUsername] = useState('');
    const [profile, setProfile] = useState([]);
    const [userId, setUserId] = useState(null);

    const 파일변경기능 = (e) => {
        //파일을 변경했을 떄 프로필 썸네일에 이미지들 주소가 넘어갈 수 있도록 설정
        const selectedFiles = Array.from(e.target.files);
        console.log(selectedFiles);
        setFiles(selectedFiles);

    }

    /*
    const 유저이름변경 = (e) => {
        setUsername(e.target.value);
    }
    */

    const imageUpload = async () => { // async () : 잠시 대기해야할 코드가 적혀있음을 알림
        const formData = new FormData();
        Array.from(files).forEach(file => {
            formData.append("files", file);
        });
        formData.append("username", username);

        // formData를 가져오기 전까지 잠시 대기. 정보를 가져오는 것보다 실행이 더 빠를 수 있기 때문
        await axios.post(uploadAPI, formData, {
        })
        .then(res => {
            const data = res.data;
            getPosts();
        })
    }

    const getPosts = async () => {
        await axios.get(watchingAPI)
        .then (res => {
            setProfile(res.data);
        })
    }

    useEffect(() => {
        getPosts();
    },[]);

    //프로필 수정
    const modifying = (p) => {
        setUserId(p.userId); //수정할 사용자 ID 설정
        setUsername(p.username);
    }

    console.log(profile);
    return (
        <div>
            <h1>프로필 이미지 업로드</h1>
            <div className="profile-thumbnail">
                {files.length > 0 && files.map((file, index) => (
                    <div key={index}>
                        <img src={URL.createObjectURL(file)} alt="profile" />
                    </div>
                ))}
            </div>

            <input type="file" onChange={파일변경기능} />
            <input type="text" placeholder="닉네임 입력" value={username} onChange={(e) => setUsername(e.target.value)} />
            {/* 첫 번째 input 방식과 두 번째 input 방식은 똑같은 효과임 */}
            <button onClick={imageUpload}>프로필 저장</button>
            <hr/>
            <div className="profiles-container">
                {profile && profile.map(post => (
                    <div key={post.userId} className='post'>
                        <h2>{post.username}</h2>
                        <p>{post.createdAt}</p>
                        <div className='images'>
                            {post.profileImageUrl && post.profileImageUrl.split(',').map(image => (
                                <img key={image} src={`http://localhost:9015/images/${image}`} alt='imgFile' />
                            ))}
                        </div>
                        {/* <button onClick={modifying(post)}>수정하기</button>*/}
                    </div>
                ))}
            </div>
        </div>
    )
}
export default Profile;

 

시현 사진

 

 

 

 

 

 

※ fetch, axios(then), axios(async, await) 구분하기

    //1. fetch = 설치가 불필요. 리액트 자체에서 제공하는 java 백엔드와 통신하는 기능
    const imageUpload1 = () => {
        const formData = new FormData(); //files 이미지 파일이 여러개이므로 묶어서 보냄
        Array.from(files).forEach(file => {
            formData.append("files", file);
        });
        formData.append("username", username);
        fetch(uploadAPI, {
            method: 'POST', //DB에 값을 저장하기 위한 post
            //headers : {'Content-Type' : 'multipart/form-data'}, //데이터에 파일(이미지)이 포함됨을 자바에 알림
            body: formData
        })
        //DB에 값 넣기를 성공했다면 수행할 작업
        .then(res => {
            //응답에 대한 결과를 json(자바에서 Map일 때) 또는 text(자바에서 String 일때) 형식으로 받음
            return res.text();
        })
        .then(data => {
            //DB에 저장된 프로필 사진과 닉네임을 보여줌 -> 업로드하고 사용자들이 눈치 못채게 새로고침
            getPosts();

        })
    }

    //2. axios (then)
    const imageUpload2 = () => {
        const formData = new FormData(); //files 이미지 파일이 여러개이므로 묶어서 보냄
        Array.from(files).forEach(file => {
            formData.append("files", file);
        });
        formData.append("username", username);

        axios.post(uploadAPI, formData, {
            headers : {'Content-Type' : 'multipart/form-data'}
        })
        .then(res => {
        /* 
            return res.text();
        })
        .then(data => {

        fetch에서는 위 기능이 필요하지만 axios는 불필요
        */
            const data = res.data;
            getPosts();

        })
    }

    //3. axios (await, async) = 2번의 업그레이드 버전. try/catch를 사용해서 오류 처리
    const imageUpload3 = async () => { // async () : 잠시 대기해야할 코드가 적혀있음을 알림
        const formData = new FormData();
        Array.from(files).forEach(file => {
            formData.append("files", file);
        });
        formData.append("username", username);

        //삼항 연산자를 이용해서 수정기능을 위한 url과 새 프로필을 저장할 url 설정

        // formData를 가져오기 전까지 잠시 대기. 정보를 가져오는 것보다 실행이 더 빠를 수 있기 때문
        await axios.post(uploadAPI, formData, {
        })
        .then(res => {
            const data = res.data;
            getPosts();
        })
    }

'Springboot-React' 카테고리의 다른 글

비밀번호 암호화  (0) 2024.08.14
네이버 로그인 3  (0) 2024.08.13
프로필 사진 올리기 1  (0) 2024.08.09
이미지 여러개 올리기 2  (0) 2024.08.06
이미지 여러개 올리기 1  (0) 2024.08.06