인프런 커뮤니티 질문&답변

chorokdosi님의 프로필 이미지
chorokdosi

작성한 질문수

Flutter 초급 - Http통신, 상태관리

플러터 서버에 이미지 저장하기

해결된 질문

작성

·

753

0

안녕하세요 강사님

 

제가 지금 플러터로 서버에 이미지 저장할려고 합니다. 그래서 강사님 유튜브(https://www.youtube.com/watch?v=Cz55mcHG6Xk )에 있어서 참고할려고했는데 서버를 php로 해서 php로 어떻게 적어야 할지 고민하다가 찾다보니 나온게 밑에 유튜브링크입니다.

https://www.youtube.com/watch?v=g8WEXj6xvsY 이걸 따라헀는데 안되더라고요 제가 작성한게 문제인건지 아니면 저분께 지금 안되는건지 모르겠습니다.

답변 1

0

오준석님의 프로필 이미지
오준석
지식공유자

뭐가 어떻게 안 되는지에 대한 구체적인 내용이 없어서 뭐라고 답을 해 드리기가 어렵습니다.

그런데 유튜브 영상 봤는데 잘 따라하면 될 것 같습니다.

chorokdosi님의 프로필 이미지
chorokdosi
질문자

 php DB쿼리문 수정하니 작동은 하는데 서버에 이미지가 들어가지 않습니다. 그리고 DB에는 media는 ..으로 들어갑니다 

플러터 saveImage함수에 있는 if문에서 이미지 업로드 성공으로 들어가는데 php가 문제인가요? 아니면 플러터 코드에서 잘못된건가요?

 

<?php

include('db_setup.php');

 

$media = $_FILES['media']['name'];

$name = $_POST['name'];

 

$imagePath = 'media/'.$media;

$tmp_name = $_FILES['media']['tmp_name'];

 

move_uploaded_file($tmp_name, $imagePath);

 

$result = $conn->query("INSERT INTO filedata(name,media) VALUES('.$name.','.$media.')");

$count = mysqli_num_rows($result);

 

$conn->close();

 

?>

 

 Future saveImage() async {

    final uri = Uri.parse('http://ip주소/upload.php');

    var request = http.MultipartRequest('POST', uri);

    request.fields['name'] = _titlecontroller.text;

    var pic = await http.MultipartFile.fromString('iamgeFile', _imageFile!.path);

    request.files.add(pic);

    var response = await request.send();

 

    if(response.statusCode == 200){

      print('이미지 업로드 성공');

    }else{

      print('이미지 업로드 실패');

    }

  }

오준석님의 프로필 이미지
오준석
지식공유자

코드만으로는 원인을 알 수 없지요. 에러 메시지를 통해서 어떤 문제가 있는지 파악이 되니까요.

이미지 저장이 안 된다는 것은 move_uploaded_file() 부분에 문제가 있는 것 같으니 살펴보시지요.

name, 과 media 가 비어 있는게 원인일 수 있겠군요.

chorokdosi님의 프로필 이미지
chorokdosi
질문자

name은 수정해서 값이 잘들어갑니다. 그런데 아직도 media는 DB값이 ..으로 들어갑니다 그리고 서버에는 이미지가 들어가지 않습니다. 오류뜨는건 없습니다. 

  var pic = await http.MultipartFile.fromString('iamgeFile', _imageFile!.path); 에서 String을 Path로 고쳐 봤지만 var pic = await http.MultipartFile.fromPath('media', _imageFile!.path); 이미지가 들어가지 않네요. move_uploaded_file() 에서는 뭐가 문제인지 잘모르겠습니다.

오준석님의 프로필 이미지
오준석
지식공유자

서버 코드는 유튜브 참고하여 postman 으로 테스트 해 보시면 이미지가 잘 저장되는지 확인 가능합니다. 잘 된다면 서버 문제는 아닙니다. 그럼 플러터 문제겠지요.

저장이 안되면 서버 문제겠지요.

chorokdosi님의 프로필 이미지
chorokdosi
질문자

포스트맨 했는데 서버에 이미지가 들어가지 않습니다. 서버가 문제 인거 같은데 어떤문제 인건가요? 서버는 아마존EC2 사용하고 있습니다.

오준석님의 프로필 이미지
오준석
지식공유자

실서버에서 테스트하면 에러메시지 확인도 어려우니까 서버쪽 코드를 로컬에서 확실히 테스트하시고 아마존에 올려보시는 것이 좋지 않나 싶습니다.

chorokdosi님의 프로필 이미지
chorokdosi
질문자

move_uploaded_file(): The second argument to copy() function cannot be a directory in

move_uploaded_file(): Unable to move '/tmp/phpomBmOK' to 'media/' in

postman 키값을 file로 따라해서 오류가없었습니다. 제가 쓴 media로 하니 위에 2개의 오류가 나타났습니다.

첫번째 오류는 두 번째 인수는 디렉토리가 될 수 없습니다.이고

두번째 오류는 /tmp/phpomBmOK'를 'media/'로 이동할 수 없습니다. 입니다.

어떻게 고쳐야 할까요? 두번째 오류는 aws(EC2)서버(프리티어)에서 처리해야하는 건가요?

오준석님의 프로필 이미지
오준석
지식공유자

해당 에러 검색하면 많은 사례가 나옵니다.

첫번째는 https://blog.naver.com/apchima/80101662830 참고 해 보세요.

두번째도 검색 해 보시면 다양한 경우가 있으니 확인해 보시면 좋겠고요, aws 쪽에서 디렉토리나 파일 생성 권한 같은 것도 보셔야 할 것 같습니다.

chorokdosi님의 프로필 이미지
chorokdosi
질문자

오류 고치니 해결됬습니다. 감사합니다.

chorokdosi님의 프로필 이미지
chorokdosi

작성한 질문수

질문하기