[질문] php는 file업로드를 어떻게 하는건가여?

nakrlove의 이미지

비슷한질문을 계속올립니다.

PHP에서 파일업로드가 안되어서 질문을 올립니다.
어느분께서 참조 사이트를 가르쳐주셔서 해보았는데
계속 tmp디렉토리에 접근권한이 없다고 에러가 발생하고 계속 실패 합니다.

도대체 PHP는 어떻게 파일업로드를 하는지..
php는 환경설정을 php.ini 하는건 맞죠!

답답 하기만 하내여..
왜 안되지

kirrie의 이미지

일단 문제가 되는 소스를 첨부하시는게 답변이 빠를 것 같습니다.

php는 파일 업로드는 몇가지 과정을 거칩니다.
즉, 업로드 된 파일이 바로 지정된 디렉토리에 저장되는 것이
아니라 서버의 tmp디렉토리에 먼저 저장됩니다.
그리고 나서 php 함수를 이용하여 tmp디렉토리에 저장된
업로드 파일을 원하는 장소로 복사하고 나서 tmp에 저장된
파일을 삭제합니다.
파일 업로드에 사용되는 방법은 보통 이렇습니다.

tmp에 접근권한이 없다고 나온 경우는, 말 그대로 tmp디렉토리의
퍼미션이 제한되어 있기 때문입니다. 자신이 운영하는 서버라면
tmp디렉토리의 퍼미션을 확인해보세요.

--->
데비안 & 우분투로 대동단결!

ironiris의 이미지

책한권 사보세요.
그게 더 빠를것 같군요.
컴퓨터에 앉으면 생각의 속도는 타이핑의 속도와 인터넷브라우징속도와 같아지게 됩니다.(학습속도가 느려진다는 말입니다.)
컴퓨터 전원을 내려버리고 책을 보세요.
그리고 한번 탐독을 하셨으면 그때 컴퓨터를 켜시고 책에 나온 내용대로 환경을 맞추고(무조건 최신만 설치하시지 마시고) 따라해보세요. 다 될겁니다.
요즘 국내저자들이 쓴 책들은 저자와 피드백이 가능한 경우가 많으니 똑같이 따라해보고 안되면 그때 물어봐도 안늦습니다.

nakrlove의 이미지

ironiris wrote:
책한권 사보세요.
그게 더 빠를것 같군요.
컴퓨터에 앉으면 생각의 속도는 타이핑의 속도와 인터넷브라우징속도와 같아지게 됩니다.(학습속도가 느려진다는 말입니다.)
컴퓨터 전원을 내려버리고 책을 보세요.
그리고 한번 탐독을 하셨으면 그때 컴퓨터를 켜시고 책에 나온 내용대로 환경을 맞추고(무조건 최신만 설치하시지 마시고) 따라해보세요. 다 될겁니다.
요즘 국내저자들이 쓴 책들은 저자와 피드백이 가능한 경우가 많으니 똑같이 따라해보고 안되면 그때 물어봐도 안늦습니다.

충고는 감사합니다.
책으로 모두 해결하시는것도 좋히만
인터넷으로 자료를 뒤지는 재미도 있답니다.

Linux 를 배워봅시다.

nakrlove의 이미지

kirrie wrote:
일단 문제가 되는 소스를 첨부하시는게 답변이 빠를 것 같습니다.

php는 파일 업로드는 몇가지 과정을 거칩니다.
즉, 업로드 된 파일이 바로 지정된 디렉토리에 저장되는 것이
아니라 서버의 tmp디렉토리에 먼저 저장됩니다.
그리고 나서 php 함수를 이용하여 tmp디렉토리에 저장된
업로드 파일을 원하는 장소로 복사하고 나서 tmp에 저장된
파일을 삭제합니다.
파일 업로드에 사용되는 방법은 보통 이렇습니다.

tmp에 접근권한이 없다고 나온 경우는, 말 그대로 tmp디렉토리의
퍼미션이 제한되어 있기 때문입니다. 자신이 운영하는 서버라면
tmp디렉토리의 퍼미션을 확인해보세요.

먼자 답변 감사드립니다.
그리고 연습으로 만들어보 소스를 올려봅니다.

<?
include "../common/dbconnect.inc";
$bbsTitle = $_POST['bbsTitle'];
$bbsContext = $_POST['bbsContext'];
$bbsWrite = $_POST['bbsWrite'];
$query = "insert into bbsBoard(bbsTitle,bbsContext,bbsWrite) "
." values('".$bbsTitle."','".$bbsContex."','".$bbsWrite."') ";

//$uploaddir = '/uploads/';
$uploaddir = '/tmp/';
$uploadfile = $uploaddir . $_FILES['userfile']['name'];

/*
echo "<pre>";
if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) {
echo "파일이 존재하고, 성공적으로 업로드 되었습니다.";
echo "추가 디버깅 정보입니다:\n";
print_r($_FILES);
} else {
echo "파일 업로드 공격의 가능성이 있습니다! 디버깅 정보입니다:\n";
print_r($_FILES);
}
echo "</pre>";
*/
for ($i=0;$i<5;$i++) {

if ($_FILES["userfile"]['tmp_name'][$i]) {

move_uploaded_file( $_FILES["userfile"]["tmp_name"][$i],$_FILES["userfile"]["name"][$i]);
}
}
/*
if($connect)
{
//echo" DB OK";
$result = mysql_query($query,$connect) or die(mysql_error());
echo $result;
?-->
<script >
<!--
location.href = "http://localhost/bbs/board.php";
//-->
</script>
<--?
//Headers("Location: http://localhost/bbs/board.php");

}
*/
?>

마지막으로 /tmp디렉토리는
chmod 777 /tmp로 모든권한을 주었습니다.
그래도 결과는 같게 나옵니다.

Linux 를 배워봅시다.

nakrlove의 이미지

답변 감사드립니다.
위의 사이트는 이미 참조를 했습니다.
그리고 제가본 사이트는 한글로 되어있던데여 !

techneer 라는 ID를 사용하시는 분께서 답변으로 주신 주소입니다.
http://kr.php.net/manual/kr/features.file-upload.php

내용은 똑같구여

Linux 를 배워봅시다.

atie의 이미지

서버를 fedora 쓰시나요? 그리고, selinux가 작동중인가요?
그러면, ls -Z /tmp 해서 user_u:object_r:root_t 이런게 보이면,
/sbin/restorecon /tmp 한 후, 다시 ls -Z /tmp 해서
system_u:object_r:tmp_t로 보여야 합니다.

----
I paint objects as I think them, not as I see them.
atie's minipage

ssehoony의 이미지

여전히 안된다면
php.ini 에서 로그 메시지 부분의 주석을 다 제거해서
로그를 많이 남기도록 한후에 로그 메시지를 확인해 보세요.

nakrlove의 이미지

atie wrote:
서버를 fedora 쓰시나요? 그리고, selinux가 작동중인가요?
그러면, ls -Z /tmp 해서 user_u:object_r:root_t 이런게 보이면,
/sbin/restorecon /tmp 한 후, 다시 ls -Z /tmp 해서
system_u:object_r:tmp_t로 보여야 합니다.

답변 감사드립니다.
저는 redhet 9을 사용합니다.
그래서 위에 사항과 상관이 없는것 같내여
암턴 답변 감사드립니다.

Linux 를 배워봅시다.

정태영의 이미지

phpinfo() 를 찍어보시고..

upload_tmp_dir 이 어디에 설정되어 있는지를 확인하시기 바랍니다..
기본으로 설정이 안되있을 경우는 아마도 /tmp 가 되겠지만요..

/tmp 에.. nobody 권한으로 파일을 쓸 수 있는지도 확인해보시구요..

오랫동안 꿈을 그리는 사람은 그 꿈을 닮아간다...

http://mytears.org ~(~_~)~
나 한줄기 바람처럼..

nakrlove의 이미지

정태영 wrote:
phpinfo() 를 찍어보시고..

upload_tmp_dir 이 어디에 설정되어 있는지를 확인하시기 바랍니다..
기본으로 설정이 안되있을 경우는 아마도 /tmp 가 되겠지만요..

/tmp 에.. nobody 권한으로 파일을 쓸 수 있는지도 확인해보시구요..

답변 감사드립니다.

확인결과 입니다.

* PHP Core

Directive | Local Value | Master Value
upload_tmp_dir | /tmp/ | /tmp/ <-- 이부분은 /tmp 로 수정을 해보기도 했습니다.결과는 계속 에러 발생합니다.

* apache2handler

User/Group | nobody(99)/-1

이렇게 되어 있내여..

Linux 를 배워봅시다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.