Skip to content

Commit 4f192d3

Browse files
committed
✨ Feat: 의류 업로드 기능 구현
- 의류 업로드 후, db 저장 구현 - s3에 이미지 저장 경로 변경 - 되돌리기 버튼 기능 구현
1 parent 402c2ea commit 4f192d3

File tree

5 files changed

+58
-20
lines changed

5 files changed

+58
-20
lines changed

Diff for: src/main.js

+2
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,9 @@ const infoRouter = require('./routes/UserInfo')
7474
app.use('/userInfo', infoRouter)
7575

7676
const fittingRouter = require('./routes/FittingImage')
77+
const clothUploadRouter = require('./routes/UploadClothImage')
7778
app.use('/api', fittingRouter)
79+
app.use('/api', clothUploadRouter)
7880

7981
const clothRouter = require('./routes/Clothes')
8082
app.use('/cloth', clothRouter)

Diff for: src/routes/ImageUploader.js

+2-5
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ const ImageUploader = multer({
2626
s3: s3,
2727
bucket: 'bigprogect-bucket',
2828
key: (req, file, callback) => {
29-
const userId = req.query.userId
29+
const userId = req.body.userId || req.query.userId
3030
const uploadDirectory = req.query.directory ?? userId
3131
const extension = path.extname(file.originalname)
3232
if (!allowedExtensions.includes(extension)) {
@@ -39,10 +39,7 @@ const ImageUploader = multer({
3939
if (imageType === 'body') {
4040
imageFilename = `userimage${extension}`
4141
} else if (imageType === 'clothing') {
42-
const fileName = file.originalname
43-
.substr(-10)
44-
.replace(fileExtension, '')
45-
imageFilename = `${fileName}${extension}`
42+
imageFilename = file.originalname
4643
} else {
4744
return callback(new Error('Unknown image type'))
4845
}

Diff for: src/routes/UploadClothImage.js

+7-4
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ const ImageUploader = require('./ImageUploader')
44
const Closet = require('../models/Closet')
55

66
router.post(
7-
'/api/cloth-upload',
7+
'/cloth-upload',
88
(req, res, next) => {
99
req.query.type = 'clothing'
1010
ImageUploader.single('clothingImage')(req, res, (error) => {
@@ -16,14 +16,14 @@ router.post(
1616
},
1717
async (req, res) => {
1818
// 유효성 검사: 요청 userId 확인
19-
if (!req.query.userId) {
19+
if (!req.body.userId) {
2020
return res.status(400).json({
2121
success: false,
2222
error: 'Missing userId in request.',
2323
})
2424
}
2525

26-
const userId = req.query.userId
26+
const userId = req.body.userId
2727
// 이미지 업로드 확인
2828
if (!req.file || !req.file.location) {
2929
return res.status(500).json({
@@ -34,11 +34,14 @@ router.post(
3434

3535
// 이미지 URL을 생성
3636
const clothingImageUrl = req.file.location
37+
console.log(userId)
38+
console.log(clothingImageUrl)
39+
console.log(req.body.clothesUrl)
3740
// 새 Closet 생성 및 저장
3841
try {
3942
const newCloset = new Closet({
4043
userId: userId,
41-
clothesUrl: req.query.clothesUrl,
44+
clothesUrl: req.body.clothesUrl,
4245
clothesImageLink: clothingImageUrl,
4346
})
4447

Diff for: style/src/api/authenticatedAxios.js

+5
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,11 @@ authenticatedAxios.interceptors.request.use(
88
if (token) {
99
config.headers['Authorization'] = `Bearer ${token}`
1010
}
11+
12+
if (config.data instanceof FormData) {
13+
config.headers['Content-Type'] = 'multipart/form-data'
14+
}
15+
1116
return config
1217
},
1318
(error) => {

Diff for: style/src/components/FittingPage/ButtonBar.js

+42-11
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,10 @@ import saveImage from '../../images/save.png'
1010
import uploadImage from '../../images/upload.png'
1111
import changeBgImage from '../../images/landscape.png'
1212
import resetImage from '../../images/reset.png'
13-
import testClothesImage from '../../images/test_clothes1.png'
1413
import { API_URL } from '../../api/apiConfig'
1514
import ClassMerger from '../common/ClassNameGenerater'
1615

17-
function ButtonBar({ setErrorCode, showAlert }) {
16+
function ButtonBar({ setErrorCode, showAlert, setIsDefaultPage }) {
1817
// URL 입력 저장을 위한 state 생성
1918
const [inputUrl, setInputUrl] = useState('')
2019
const [isModalOpen, setIsModalOpen] = useState(false)
@@ -33,7 +32,46 @@ function ButtonBar({ setErrorCode, showAlert }) {
3332

3433
// URL 업로드 버튼 클릭 이벤트 핸들러
3534
const handleImgUploadClick = async () => {
36-
// URL 크롤링 하는 함수 작성
35+
if (selected < 0 || selected >= clothes.length) {
36+
// 이미지 선택이 없거나 범위를 벗어난 경우
37+
return
38+
}
39+
40+
const file = await fetch(clothes[selected])
41+
.then((response) => response.blob())
42+
.then(
43+
(blob) =>
44+
new File([blob], `clothes-${Date.now()}.png`, { type: 'image/png' })
45+
)
46+
47+
const user = JSON.parse(localStorage.getItem('user'))
48+
if (!user || !user._id) {
49+
console.error('User ID not found')
50+
return
51+
}
52+
const userId = user._id
53+
const urlWithoutQueryString = inputUrl.split('?')[0]
54+
55+
const formData = new FormData()
56+
formData.append('userId', userId)
57+
formData.append('clothingImage', file)
58+
formData.append('clothesUrl', urlWithoutQueryString)
59+
for (let value of formData.values()) {
60+
console.log(value)
61+
}
62+
try {
63+
const response = await authenticatedAxios.post(
64+
`${API_URL}/api/cloth-upload`,
65+
formData
66+
)
67+
if (response.status === 200) {
68+
console.log('업로드에 성공했습니다!', response.data)
69+
} else {
70+
console.error('이미지 업로드에 실패했습니다.', response)
71+
}
72+
} catch (error) {
73+
console.error('이미지 업로드 중 오류가 발생했습니다.', error)
74+
}
3775
}
3876

3977
// url 업로드 버튼 : url에서 이미지 목록 가져옴
@@ -107,7 +145,7 @@ function ButtonBar({ setErrorCode, showAlert }) {
107145
src={resetImage}
108146
alt="reset"
109147
text="되돌리기"
110-
onClick={getUserImage}
148+
onClick={() => setIsDefaultPage(true)}
111149
/>
112150
{isModalOpen && (
113151
<div
@@ -162,13 +200,6 @@ function ButtonBar({ setErrorCode, showAlert }) {
162200
)}
163201
</div>
164202
)
165-
166-
async function getUserImage() {
167-
// 데이터베이스에서 유저의 이미지를 불러오는 함수를 호출
168-
//const userImage = await fetchUserImageFromDB();
169-
// 상태를 업데이트하여 이미지가 표시되는 곳에 사용자 이미지를 표시합니다.
170-
//setImageUrl(userImage);
171-
}
172203
}
173204

174205
function ClothesImageElement({ src, index, selected, onClick }) {

0 commit comments

Comments
 (0)