여유상점_0925 : 13) Updating Files through Multer ( including Deleting Existing File )
< Img 처리 >
- 기초과정 -
1) 기존 img 파일들 경로 모두 가져오기
2) 새로운 파일 있을 경우, 새로운 변수 담아서 Data_Form에 담기 > 각각 이름을 다르게 하기 > backend에서도 각각의 파일들을 수정시, 다른 fieldname을 토대로 수정하기 ( multer : upload > 다양한 fieldname 부여하기 )
3) 백엔드에서, req.body에는 항상 기존 img 파일 경로가 담겨 있을 것이다
4) 각각의 img 파일 여부, 및 첨부파일 여부에 따라서, 있을 경우, 원래 경로에 있던 이미지 삭제하는 과정도 넣기 ( 어차피 req.files ~ 를 통해 확인된다는 것은, 이미 업로드가 되었다는 것이므로, 삭제 과정만 추가적으로 거치면 된다 )
fs unlink 동기적 처리 > promise : Flow Control
원래 소스 코드
// 첫번째 photo를 update 했다면 : 기존의 이미지를 지워준다
if(req.files.EditPhoto1){
let BefImg1Path = req.body.ProjImg1.split('/')
let BefImg1Name = BefImg1Path[BefImg1Path.length -1]
fs.unlink(__dirname + '../../../../client/data/img/uploadedImage/Projects/'+ BefImg1Name, async (err, data) =>{
if(err){
// 만약 해당 파일이 없는 경우 ( 원래는 있어야 하는데, 관리자가 임의로 지웠을 수 있다)
if( err.message.split(' ')[0] == 'ENOENT:'){
console.log(err)
console.log("hello")
}else{
console.log(err)
return res.status(404).json({ message : "Existing Image Delete Error"})
}
}
})
}
// 2번째 photo를 update 했다면 : 기존의 이미지를 지워준다
if(req.files.EditPhoto2){
let BefImg2Path = req.body.ProjImg2.split('/')
let BefImg2Name = BefImg2Path[BefImg2Path.length -1]
fs.unlink(__dirname + '../../../../client/data/img/uploadedImage/Projects/'+ BefImg2Name, async (err, data) =>{
if(err){
// 만약 해당 파일이 없는 경우 ( 원래는 있어야 하는데, 관리자가 임의로 지웠을 수 있다)
if( err.message.split(' ')[0] == 'ENOENT:'){
console.log(err)
console.log("hello")
}else{
console.log(err)
return res.status(404).json({ message : "Existing Image Delete Error"})
}
}
})
}
// 3번째 photo를 update 했다면 : 기존의 이미지를 지워준다
if(req.files.EditPhoto3){
let BefImg3Path = req.body.ProjImg3.split('/')
let BefImg3Name = BefImg3Path[BefImg3Path.length -1]
fs.unlink(__dirname + '../../../../client/data/img/uploadedImage/Projects/'+ BefImg3Name, async (err, data) =>{
if(err){
// 만약 해당 파일이 없는 경우 ( 원래는 있어야 하는데, 관리자가 임의로 지웠을 수 있다)
if( err.message.split(' ')[0] == 'ENOENT:'){
console.log(err)
console.log("hello")
}else{
console.log(err)
return res.status(404).json({ message : "Existing Image Delete Error"})
}
}
})
}
// Intended Fiinal code
console.log(req.files)
의도한 대로라면, err 와 관련된 모든 콘솔들이 다 찍히고
마지막에 req.files가 찍혀야 하는데...
그러지 못하고 있다는 점 ... 오히려 콜백 function의 특성상
비동기 처리로 인식되어 console.log(req.files) 가 모두 찍히고 나서 나중에야 비로소 검사가 이루어지는 함정이 있다
Promise.Api를 사용해서 비동기 처리 하기
upload(req,res,(err) => {
if(err){
console.log("error in multer")
console.log(err)
if( err == 'Images Only'){
// Photo Upload 오류
console.log("Image upload Error")
return res.status(402).json({ message : "Photo Upload Error"})
}else if(err == "pdf, plain txt, csv, html, msword only"){
// 첨부파일 upload 오류
console.log("File upload Error")
return res.status(401).json({ message : "File Upload Error"})
}
}else{
function EditPhoto1() {
return new Promise(( resolve, reject) => {
// 첫번째 photo를 update 했다면 : 기존의 이미지를 지워준다
if(req.files.EditPhoto1){
let BefImg1Path = req.body.ProjImg1.split('/')
let BefImg1Name = BefImg1Path[BefImg1Path.length -1]
fs.unlink(__dirname + '../../../../client/data/img/uploadedImage/Projects/'+ BefImg1Name, async (err, data) =>{
if(err){
// 만약 해당 파일이 없는 경우 ( 원래는 있어야 하는데, 관리자가 임의로 지웠을 수 있다)
if( err.errno == -4058){
console.log(err)
resolve('Photo1 Not Exist but Pass')
}else{
reject( new Error('Photo1 Error'))
// return res.status(404).json({ message : "Existing Image Delete Error"})
}
}
})
}else{
resolve('Photo1 Ok')
}
})
}
function EditPhoto2(){
return new Promise(( resolve, reject) => {
// 2번째 photo를 update 했다면 : 기존의 이미지를 지워준다
if(req.files.EditPhoto2){
let BefImg2Path = req.body.ProjImg2.split('/')
let BefImg2Name = BefImg2Path[BefImg2Path.length -1]
fs.unlink(__dirname + '../../../../client/data/img/uploadedImage/Projects/'+ BefImg2Name, async (err, data) =>{
if(err){
// 만약 해당 파일이 없는 경우 ( 원래는 있어야 하는데, 관리자가 임의로 지웠을 수 있다)
if( err.errno == -4058){
resolve('Photo2 Not Exist but Pass')
}else{
reject( new Error('Photo2 Error'))
//return res.status(404).json({ message : "Existing Image Delete Error"})
}
}
})
}else{
resolve('Photo2 Ok')
}
})
}
function EditPhoto3 (){
return new Promise(( resolve, reject) => {
// 3번째 photo를 update 했다면 : 기존의 이미지를 지워준다
if(req.files.EditPhoto3){
let BefImg3Path = req.body.ProjImg3.split('/')
let BefImg3Name = BefImg3Path[BefImg3Path.length -1]
fs.unlink(__dirname + '../../../../client/data/img/uploadedImage/Projects/'+ BefImg3Name, async (err, data) =>{
if(err){
// 만약 해당 파일이 없는 경우 ( 원래는 있어야 하는데, 관리자가 임의로 지웠을 수 있다)
if( err.errno == -4058){
resolve('Photo3 Not Exist but Pass')
}else{
reject( new Error('Photo3 Error'))
// return res.status(404).json({ message : "Existing Image Delete Error"})
}
}
})
}else{
resolve('Photo3 Ok')
}
})
}
// 위의 파일
Promise.all([EditPhoto1(), EditPhoto2(), EditPhoto3()])
.then((values) => {
console.log(values)
// req.body로부터 기존 사항들을 가져온다
const {
ProgUniqueId,
ProjProgNum,
ProgLoc,
ProgSubLoc,
ProjTitle,
ProjReg,
ProjConf,
ProjRegTimeStart,
ProjRegTimeEnd,
ProjActTimeStart ,
ProjActTimeEnd ,
ProjCost ,
ProjOpt1 ,
ProjOpt1Cost ,
ProjOpt2,
ProjOpt2Cost ,
ProjOpt3,
ProjOpt3Cost,
ProjIsNew ,
ProjIsHot ,
ProjImg1 ,
ProjImg2 ,
ProjImg3 ,
ProjCreatImg ,
ProjCreatName,
ProjOneLine ,
ProjRecom,
ProjLocExp ,
ProjProgExp ,
ProjActExp,
ProjCaution,
ProjSchedule,
ProjCostExp,
ProjRoom,
ProjSup,
ProjQuestion
} = req.body;
console.log(req.files)
// img src 혹은 실제 파일 중에서 최종적으로 update할 요소로 대체한다
let FinalImg1 = ""
if(req.files.EditPhoto1){
FinalImg1 = 'http://localhost:3100' + req.files.EditPhoto1[0].destination.split('data')[1] + req.files.EditPhoto1[0].filename
}else{
FinalImg1 = ProjImg1
}
let FinalImg2 = ""
if(req.files.EditPhoto2){
FinalImg2 = 'http://localhost:3100' + req.files.EditPhoto2[0].destination.split('data')[1] + req.files.EditPhoto2[0].filename
}else{
FinalImg2 = ProjImg2
}
let FinalImg3 = ""
if(req.files.EditPhoto3){
FinalImg3 = 'http://localhost:3100' + req.files.EditPhoto3[0].destination.split('data')[1] + req.files.EditPhoto3[0].filename
}else{
FinalImg3 = ProjImg3
}
let FinalCreatImg = ""
if(req.files.EditCreatPhoto){
FinalCreatImg = 'http://localhost:3100' +req.files.EditCreatPhoto[0].destination.split('data')[1] + req.files.EditCreatPhoto[0].filename
}else{
FinalCreatImg = ProjCreatImg
}
console.log(FinalImg1)
console.log(FinalImg2)
console.log(FinalImg3)
console.log(FinalCreatImg)
console.log("img change")
// 2. admin_region table에 지역 정보만 넣기
connection.db_rest.query(`UPDATE project
SET
Location = ?,
LocationRegion = ?,
RegStartDate = ?,
RegEndDate = ?,
Act_StartDate = ?,
Act_EndDate = ?,
Questions = ?,
Option1 = ?,
Option1_Cost = ?,
Option2 = ?,
Option2_Cost = ?,
Option3 = ?,
Option3_Cost = ?,
Prog_Name = ?,
Is_New = ?,
Is_Hot = ?,
TItle_Img1 = ?,
TItle_Img2 = ?,
TItle_Img3 = ?,
Creator_Img = ?,
Creator_Name = ?,
Creator_Comment = ?,
Prog_Exp_One = ?,
Prog_Exp = ?,
Act_Exp = ?,
Rooms = ?,
Caution = ?,
Cost_Program = ?,
Cost_Exp = ?,
Schedule = ?,
Support = ?,
Prog_Num = ?,
Regist_Num = ?,
Confirm_Num = ?
WHERE UniqueId = ?
`,[ProgLoc, ProgSubLoc,ProjRegTimeStart,ProjRegTimeEnd,ProjActTimeStart
,ProjActTimeEnd,ProjQuestion ,ProjOpt1 ,ProjOpt1Cost ,ProjOpt2, ProjOpt2Cost,
ProjOpt3, ProjOpt3Cost, ProjTitle, ProjIsNew,ProjIsHot, FinalImg1, FinalImg2,
FinalImg3, FinalCreatImg, ProjCreatName , ProjRecom, ProjOneLine,
ProjProgExp,ProjActExp,ProjRoom, ProjCaution, ProjCost , ProjCostExp
, ProjSchedule,ProjSup ,ProjProgNum, ProjReg, ProjConf , ProgUniqueId], (error, result) => {
if(error){
console.log("Error in programRegion Update")
console.log(error);
return res.status(400).json({message : 'failed'})
}else{
return res.status(200).json({ message : 'success'})
}
})
}).catch(console.log)
~~
즉, Promise 3개가 끝나면
그 이후에 mysql 접근을 하는 코드를 작성한다
최종 프론트
// Projecxt 수정
let ProjectEditForm = document.forms.namedItem('projectEdit');
ProjectEditForm.addEventListener('submit', (event) => {
event.preventDefault()
console.log("click")
// 항목들 불러오기 ------------------------------------------
// Id
let UniqueId = document.getElementById('ProgUniqueId')
// 일련번호
let ProgNum = document.getElementById('ProjProgNum')
// 지역
let ProgLoc = ""
// 주변 지역
let ProgSubLoc = ""
if( document.getElementById('ProjLocation').value != ""){
ProgLoc = document.getElementById('ProjLocation')
if( ProgLoc.value == "도시"){
ProgSubLoc = document.getElementById('ProjLocation_City')
}else if( ProgLoc.value == "자연"){
ProgSubLoc = document.getElementById('ProjLocation_County')
}
}else{
ProgLoc = document.getElementById('ProjOldLoc')
ProgSubLoc = document.getElementById('ProjOldSubLoc')
}
// 프로그램 Title
let ProgName = document.getElementById('ProjTitle')
// 신청자 수
let ProgRegNum = document.getElementById('ProjReg')
// 확정자 수
let ProgConfNum = document.getElementById('ProjConf')
// 신청기간 start
let ProgRegStart = ""
if( document.getElementById('ProjRegTimeStartNew').value ){
ProgRegStart = document.getElementById('ProjRegTimeStartNew')
}else{
ProgRegStart = document.getElementById('ProjRegTimeStart')
}
// 신청기간 end
let ProgRegEnd = ""
if( document.getElementById('ProjRegTimeEndNew').value ){
ProgRegEnd = document.getElementById('ProjRegTimeEndNew')
}else{
ProgRegEnd = document.getElementById('ProjRegTimeEnd')
}
// 참가기간 start
let ProgActStart = ""
if( document.getElementById('ProjActTimeStartNew').value ){
ProgActStart = document.getElementById('ProjActTimeStartNew')
}else{
ProgActStart = document.getElementById('ProjActTimeStart')
}
// 참가기간 end
let ProgActEnd = ""
if( document.getElementById('ProjActTimeEndNew').value ){
ProgActEnd = document.getElementById('ProjActTimeEndNew')
}else{
ProgActEnd = document.getElementById('ProjActTimeEnd')
}
// 비용
let ProgCost = document.getElementById('ProjCost')
// 옵션 1
let ProgOpt1 = document.getElementById('ProjOpt1')
// 옵션 1 비용
let ProgOpt1Cost = document.getElementById('ProjOpt1Cost')
// 옵션 2
let ProgOpt2 = document.getElementById('ProjOpt2')
// 옵션 2 비용
let ProgOpt2Cost = document.getElementById('ProjOpt2Cost')
// 옵션 3
let ProgOpt3 = document.getElementById('ProjOpt3')
// 옵션 3 비용
let ProgOpt3Cost = document.getElementById('ProjOpt3Cost')
// Is_New
let Is_New = document.getElementById('ProjIsNew')
// Is_Hot
let Is_Hot = document.getElementById('ProjIsHot')
// Img1
let Img1Src = document.getElementById('ProjImg1')
let NewImg1 = null
console.log("NewImg:",NewImg1)
if(document.getElementById('ProjImg1New').files[0] != undefined){
NewImg1 = document.getElementById('ProjImg1New').files[0]
// 이미지 형식 검사
uploadFile(NewImg1)
}
console.log("NewImg:",NewImg1)
// Img2
let Img2Src = document.getElementById('ProjImg2')
let NewImg2 = null
if(document.getElementById('ProjImg2New').files[0] != undefined){
NewImg2 = document.getElementById('ProjImg2New').files[0]
uploadFile(NewImg2)
}
// Img3
let Img3Src = document.getElementById('ProjImg3')
let NewImg3 = null
if(document.getElementById('ProjImg3New').files[0] != undefined){
NewImg3 = document.getElementById('ProjImg3New').files[0]
uploadFile(NewImg3)
}
// Creator Img
let CreatImg = document.getElementById('ProjCreatImg')
let NewCreatImg = null
if(document.getElementById('ProjCreatImgNew').files[0] != undefined){
NewCreatImg = document.getElementById('ProjCreatImgNew').files[0]
uploadFile(CreatImg)
}
// Related File
let ProgFiles = document.getElementById('ProjFile')
// Creator Name
let CreatName = document.getElementById('ProjCreatName')
// Recommend
let Recommend = document.getElementById('ProjRecom')
// One Line
let ProgOneLine = document.getElementById('ProjOneLine')
// LocExp ( 지역 소개 )
let ProgLocExp = document.getElementById('ProjLocExp')
// ProgExp ( 프로그램 소개 )
let ProgExp = document.getElementById('ProjProgExp')
// ProgActExp
let ProgActExp = document.getElementById('ProjActExp')
// Caution
let Caution = document.getElementById('ProjCaution')
// Schedule
let Schedule = document.getElementById('ProjSchedule')
// ProgCostExp
let ProgCostExp = document.getElementById('ProjCostExp')
// ProjRoom ( 숙소 제공 사항)
let ProjRoom = document.getElementById('ProjRoom')
// ProgSupport ( 제공 사항 )
let ProgSupp = document.getElementById('ProjSup')
// Prog Qusetion ( 자주 묻는 질문 )
let ProgQuestion = document.getElementById('ProjQuestion')
//Textarea들은 '/n'을 <br>로 변환 ------------------------
let ProjTextAreas = [ ProgOneLine ,ProgLocExp, ProgExp , ProgActExp ,
Caution, Schedule,ProgCostExp, ProjRoom, ProgSupp,ProgQuestion ]
ProjTextAreas.forEach((TextArea) => {
TextArea.value = ChangeBr(TextArea.value)
})
let Data_Form = new FormData()
// input : type = "text" with class = "input_text"
let ProjInputs = [ UniqueId, ProgNum,ProgLoc,ProgSubLoc,ProgName,ProgRegNum ,
ProgConfNum ,ProgRegStart,ProgRegEnd, ProgActStart, ProgActEnd,
ProgCost ,ProgOpt1, ProgOpt1Cost, ProgOpt2, ProgOpt2Cost, ProgOpt3 ,
ProgOpt3Cost ,CreatName,Recommend, Is_New,Is_Hot,Img1Src,Img2Src,Img3Src,CreatImg ]
ProjInputs.forEach((input) => {
if( input == Img1Src || input == Img2Src || input == Img3Src || input == CreatImg){
Data_Form.append(input.attributes.id.value, input.src)
}else if( input == ProgLoc ){
Data_Form.append("ProgLoc", input.value)
}else if( input == ProgSubLoc ){
Data_Form.append("ProgSubLoc", input.value)
}else{
Data_Form.append(input.attributes.id.value, input.value)
}
})
// TextAreas
ProjTextAreas.forEach((TextArea) => {
Data_Form.append(TextArea.attributes.id.value, TextArea.value)
})
// Files_ Images
if(NewImg1 != null){
Data_Form.append('EditPhoto1', NewImg1)
}
if(NewImg2 != null){
Data_Form.append('EditPhoto2', NewImg2)
}
if(NewImg3 != null){
Data_Form.append('EditPhoto3', NewImg3)
}
if(CreatImg != null){
Data_Form.append('EditCreatPhoto', CreatImg)
}
// Files_ 첨부 파일 등
// Data_Form.append('Files', AddedFile)
fetch('http://localhost:3100/admin/projectEdit',
{method : 'POST',body : Data_Form})
.then(res => res.json())
.then(res => {
console.log(res)
if(res.message === 'success'){
alert(`프로젝트가 성공적으로 업로드 되었습니다`)
console.log('project upload successful')
setTimeout(() => {
window.location.href = "/admin/part/3"
}, 1000);
}else if( res.message === 'failed'){
alert("서버 오류 . 고객센터 문의 혹은 다시 시도")
event.preventDefault()
}else if( res.message == 'Image Error'){
alert("Image 처리 오류")
event.preventDefault()
}else if( res.message == 'Image Too many'){
alert("Image 를 너무 많이 올렸습니다")
event.preventDefault()
}else if( res.status == "Photo Upload Error"){
alert("사진 업로드 이상해요. 사진 형식 확인해주세요 ~ jpeg|jpg|png|gif 만 !")
event.preventDefault()
}else if( res.message == "File Upload Error"){
alert("첨부파일 업로드 이상해요. pdf, csv, txt, html, xlsx 만")
event.preventDefault()
}else if( res.message == "Existing Image Delete Error"){
alert("기존 파일을 지우는 과정에서 오류가 있어요. 개발자 문의해주세요")
event.preventDefault()
}
})
.catch(error => {
console.log(error)
})
})
최종 백앤드
// Set The Storage Engine
const storage = multer.diskStorage({
destination: __dirname + '../../../../client/data/img/uploadedImage/Projects/',
filename: function(req, file, cb){
cb(null,Date.now() + '-' + file.originalname );
}
});
// Init Upload
const upload = multer({
storage: storage,
limits:{fileSize: 1000000},
fileFilter: function(req, file, cb){
checkFileType(file, cb);
}
}).fields([
// 사진
{ name : 'Photos', maxCount : 10 },
// 첨부 파일
{ name : 'Files', maxCount : 5 },
// 수정 img 1
{ name : 'EditPhoto1', maxCount : 5 },
// 수정 img 2
{ name : 'EditPhoto2', maxCount : 5 },
// 수정 img 3
{ name : 'EditPhoto3', maxCount : 5 },
// 수정 img 4
{ name : 'EditCreatPhoto', maxCount : 5 },
])
// Check File Type
function checkFileType(file, cb){
// 파일이 존재한다면
// 업로드 파일이 사진이라면
if( file.fieldname == 'Photos' ||
file.fieldname == 'EditPhoto1' ||
file.fieldname == 'EditPhoto2' ||
file.fieldname == 'EditPhoto3'){
// 1 Allowed Img ext
const Imgfiletypes = /jpeg|jpg|png|gif/;
// 1 Check Img ext
const Imgextname = Imgfiletypes.test(path.extname(file.originalname).toLowerCase());
// 1 Check Img mime
const Imgmimetype = Imgfiletypes.test(file.mimetype);
if(Imgmimetype && Imgextname){
return cb(null,true);
}else {
cb('Images Only');
}
// 업로드 파일이 사진 이외의 것이라면
}
else{
if(file != undefined){
if (
file.mimetype === 'application/pdf' ||
file.mimetype === 'text/plain' ||
file.mimetype === 'text/csv' ||
file.mimetype === 'text/html' ||
file.mimetype === 'application/msword' ||
file.mimetype === 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' ||
file.mimetype === 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'
) { // check file type to be pdf, doc, or docx
cb(null, true);
} else {
cb('pdf, plain txt, csv, html, msword only'); // else fails
}
}
}
}
// project Edit
router.post('/projectEdit', (req,res) => {
upload(req,res,(err) => {
if(err){
console.log("error in multer")
console.log(err)
if( err == 'Images Only'){
// Photo Upload 오류
console.log("Image upload Error")
return res.status(402).json({ message : "Photo Upload Error"})
}else if(err == "pdf, plain txt, csv, html, msword only"){
// 첨부파일 upload 오류
console.log("File upload Error")
return res.status(401).json({ message : "File Upload Error"})
}
}else{
function EditPhoto1() {
return new Promise(( resolve, reject) => {
// 첫번째 photo를 update 했다면 : 기존의 이미지를 지워준다
if(req.files.EditPhoto1){
let BefImg1Path = req.body.ProjImg1.split('/')
let BefImg1Name = BefImg1Path[BefImg1Path.length -1]
fs.unlink(__dirname + '../../../../client/data/img/uploadedImage/Projects/'+ BefImg1Name, async (err, data) =>{
if(err){
// 만약 해당 파일이 없는 경우 ( 원래는 있어야 하는데, 관리자가 임의로 지웠을 수 있다)
if( err.errno == -4058){
console.log(err)
resolve('Photo1 Not Exist but Pass')
}else{
reject( new Error('Photo1 Error'))
// return res.status(404).json({ message : "Existing Image Delete Error"})
}
}
})
}else{
resolve('Photo1 Ok')
}
})
}
function EditPhoto2(){
return new Promise(( resolve, reject) => {
// 2번째 photo를 update 했다면 : 기존의 이미지를 지워준다
if(req.files.EditPhoto2){
let BefImg2Path = req.body.ProjImg2.split('/')
let BefImg2Name = BefImg2Path[BefImg2Path.length -1]
fs.unlink(__dirname + '../../../../client/data/img/uploadedImage/Projects/'+ BefImg2Name, async (err, data) =>{
if(err){
// 만약 해당 파일이 없는 경우 ( 원래는 있어야 하는데, 관리자가 임의로 지웠을 수 있다)
if( err.errno == -4058){
resolve('Photo2 Not Exist but Pass')
}else{
reject( new Error('Photo2 Error'))
//return res.status(404).json({ message : "Existing Image Delete Error"})
}
}
})
}else{
resolve('Photo2 Ok')
}
})
}
function EditPhoto3 (){
return new Promise(( resolve, reject) => {
// 3번째 photo를 update 했다면 : 기존의 이미지를 지워준다
if(req.files.EditPhoto3){
let BefImg3Path = req.body.ProjImg3.split('/')
let BefImg3Name = BefImg3Path[BefImg3Path.length -1]
fs.unlink(__dirname + '../../../../client/data/img/uploadedImage/Projects/'+ BefImg3Name, async (err, data) =>{
if(err){
// 만약 해당 파일이 없는 경우 ( 원래는 있어야 하는데, 관리자가 임의로 지웠을 수 있다)
if( err.errno == -4058){
resolve('Photo3 Not Exist but Pass')
}else{
reject( new Error('Photo3 Error'))
// return res.status(404).json({ message : "Existing Image Delete Error"})
}
}
})
}else{
resolve('Photo3 Ok')
}
})
}
// 위의 파일
Promise.all([EditPhoto1(), EditPhoto2(), EditPhoto3()])
.then((values) => {
console.log(values)
// req.body로부터 기존 사항들을 가져온다
const {
ProgUniqueId,
ProjProgNum,
ProgLoc,
ProgSubLoc,
ProjTitle,
ProjReg,
ProjConf,
ProjRegTimeStart,
ProjRegTimeEnd,
ProjActTimeStart ,
ProjActTimeEnd ,
ProjCost ,
ProjOpt1 ,
ProjOpt1Cost ,
ProjOpt2,
ProjOpt2Cost ,
ProjOpt3,
ProjOpt3Cost,
ProjIsNew ,
ProjIsHot ,
ProjImg1 ,
ProjImg2 ,
ProjImg3 ,
ProjCreatImg ,
ProjCreatName,
ProjOneLine ,
ProjRecom,
ProjLocExp ,
ProjProgExp ,
ProjActExp,
ProjCaution,
ProjSchedule,
ProjCostExp,
ProjRoom,
ProjSup,
ProjQuestion
} = req.body;
console.log(req.files)
// img src 혹은 실제 파일 중에서 최종적으로 update할 요소로 대체한다
let FinalImg1 = ""
if(req.files.EditPhoto1){
FinalImg1 = 'http://localhost:3100' + req.files.EditPhoto1[0].destination.split('data')[1] + req.files.EditPhoto1[0].filename
}else{
FinalImg1 = ProjImg1
}
let FinalImg2 = ""
if(req.files.EditPhoto2){
FinalImg2 = 'http://localhost:3100' + req.files.EditPhoto2[0].destination.split('data')[1] + req.files.EditPhoto2[0].filename
}else{
FinalImg2 = ProjImg2
}
let FinalImg3 = ""
if(req.files.EditPhoto3){
FinalImg3 = 'http://localhost:3100' + req.files.EditPhoto3[0].destination.split('data')[1] + req.files.EditPhoto3[0].filename
}else{
FinalImg3 = ProjImg3
}
let FinalCreatImg = ""
if(req.files.EditCreatPhoto){
FinalCreatImg = 'http://localhost:3100' +req.files.EditCreatPhoto[0].destination.split('data')[1] + req.files.EditCreatPhoto[0].filename
}else{
FinalCreatImg = ProjCreatImg
}
console.log(FinalImg1)
console.log(FinalImg2)
console.log(FinalImg3)
console.log(FinalCreatImg)
console.log("img change")
// 2. admin_region table에 지역 정보만 넣기
connection.db_rest.query(`UPDATE project
SET
Location = ?,
LocationRegion = ?,
RegStartDate = ?,
RegEndDate = ?,
Act_StartDate = ?,
Act_EndDate = ?,
Questions = ?,
Option1 = ?,
Option1_Cost = ?,
Option2 = ?,
Option2_Cost = ?,
Option3 = ?,
Option3_Cost = ?,
Prog_Name = ?,
Is_New = ?,
Is_Hot = ?,
TItle_Img1 = ?,
TItle_Img2 = ?,
TItle_Img3 = ?,
Creator_Img = ?,
Creator_Name = ?,
Creator_Comment = ?,
Prog_Exp_One = ?,
Prog_Exp = ?,
Act_Exp = ?,
Rooms = ?,
Caution = ?,
Cost_Program = ?,
Cost_Exp = ?,
Schedule = ?,
Support = ?,
Prog_Num = ?,
Regist_Num = ?,
Confirm_Num = ?
WHERE UniqueId = ?
`,[ProgLoc, ProgSubLoc,ProjRegTimeStart,ProjRegTimeEnd,ProjActTimeStart
,ProjActTimeEnd,ProjQuestion ,ProjOpt1 ,ProjOpt1Cost ,ProjOpt2, ProjOpt2Cost,
ProjOpt3, ProjOpt3Cost, ProjTitle, ProjIsNew,ProjIsHot, FinalImg1, FinalImg2,
FinalImg3, FinalCreatImg, ProjCreatName , ProjRecom, ProjOneLine,
ProjProgExp,ProjActExp,ProjRoom, ProjCaution, ProjCost , ProjCostExp
, ProjSchedule,ProjSup ,ProjProgNum, ProjReg, ProjConf , ProgUniqueId], (error, result) => {
if(error){
console.log("Error in programRegion Update")
console.log(error);
return res.status(400).json({message : 'failed'})
}else{
return res.status(200).json({ message : 'success'})
}
})
}).catch(console.log)
}
})
})
Author And Source
이 문제에 관하여(여유상점_0925 : 13) Updating Files through Multer ( including Deleting Existing File )), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@dhsys112/여유상점0925-13-Updating-Files-through-Multer-including-Deleting-Existing-File저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)