2012-12-20 2 views
4

웹 개발자의 최신 버전 또는 그 이전 버전에서는 사용자가 업로드 한 파일 및 이미지를 처리해야합니다.사용자 제공 파일 및 이미지 업로드, 처리, 저장 및 전달

일반적인 질문 :

어떻게 업로드하나요?

최신 웹 브라우저 및 기술을 통해 사용자 제공 파일을 여러 가지 방법으로 내 서버에 업로드 할 수 있습니다. 모범 사례는 무엇이며 무엇을 고려해야합니까?

어떻게 처리합니까?

업로드가 완료되면 내가 무엇 보안에 대해 알아야 할, 그리고

가 어떻게 저장하고 제공 할 파일의 추가 처리합니까?

업로드 된 파일을 저장하는 가장 좋은 방법이 있습니까?

면책 조항 : 다음 질문에 대한 답은 거의 30 분이 남았습니다. 사용자가 제공 한 파일을 다룰 때 사용자가 직면 할 수있는 일반적인 질문을하기로 결정했습니다. 내 답변보기, 아이디어를 제공하고 아이디어를 추가 할 수 있습니다.

+0

답변을 게시하기 전에 제거 된 qustion에 대한 어려운 답변입니다. –

+0

+1 ... 하지만 hakra 같은 질문을 시도해 튜토리얼에 상관없이 .. 면책 조항 대신 .. 우리 모두 알고 t 모자는 좋은 콘텐츠로 많은 것을 쓰는 데 노력과 귀중한 시간을 필요로합니다 .... –

답변

21

각 단계마다 "최선의"방법은 없지만 다양한 기법과 라이브러리 중에서 다양한 방법과 모범 사례가 있습니다. 사용자 친화적 인 업로드, 보안 및 속도를 달성하는 데 도움이 될 수 있습니다.

불행히도 삭제 된 다른 질문에 대해서는이 작은 안내서를 작성했습니다. 그것은 일생 년대

사용자 - 기여 파일 또는 이미지를 여러 단계를 통해 안내 :

  1. 업로드 자체
  2. validaton 리사이징 스토리지 (예 형식 변환, 섬네일 생성
  3. 처리 .. .)
  4. 프론트 엔드 측
  5. 전달 기억
,

이 모든 단계를 ADRESS 가능한 멀리

1과 예제를 제공합니다 업로드

현대 웹 브라우저가 파일을 업로드 할 수있는 여러 가지 방법을 제공합니다.

가장 간단한 방법은 간단한 <input type="file" name="userFile" /> 태그가있는 양식을 만드는 것입니다. 양식이 제출되면 파일은 POST를 사용하여 전송되며 PHP

1.1의 $_FILESsuperglobal으로 액세스 할 수 있습니다. HTML 양식이 제출

<form action="upload.php" method="post" enctype="multipart/form-data"> 
    <input type="file" name="userFile1" /> 
    <input type="file" name="userFile2" /> 
    <input type="submit" value="upload files" /> 
</form> 

에서 간단한 양식, POST 요청은 업로드 전송됩니다.ph 이런 종류의 업로드는 사용자에게 친숙하지 않습니다. 사용자는 업로드 진행 상황을 보지 못하며 여러 파일을 업로드하면 고통이 될 것입니다.

1.2. 이 솔루션에서 자바 스크립트 아약스 업로드

는 POST는 자바 스크립트

http://www.saaraan.com/2012/05/ajax-image-upload-with-progressbar-with-jquery-and-php

1.3 비동기 적으로 수행된다. HTML 5 업로드

최신 브라우저가 진행 표시 줄 및 미리보기에 아주 좋은 및 사용자 친화적 업로드 마스크를 허용 HTML5를 지원 - 국경은 자신의 창의력 예를 들어

, 난 정말이 데모 같은 : http://html5demos.com/dnd-upload

서버 쪽

사용하려는 업로드 기술에 상관없이 업로드는 스크립트로 전송 된 HTTP POST로 끝납니다. 모든 추가 처리는 서버에서 수행됩니다. 임시 경로에

는 PHP 복사 파일을 (upload_tmp_dir)

ini_set으로 온 - 더 - 플라이 당신이 당신의 php.ini 파일 또는 조정할 수있는 몇 가지 다른 업로드 관련 설정이 있습니다 http://php.net/manual/en/ini.core.php#ini.sect.file-uploads

$_FILES 자동 전역이 업로드에 성공한 후 보이는 방법이다

<pre> 
<?php 
print_r($_FILES); 

upload.php로.

  • 이름 : 원래 이름
  • 유형 : 서버 임시 파일 이름
  • 오류 : 브라우저에서 제공하는 마임 타입
  • 크기 : 바이트 크기
  • tmp_name 오류 코드로 described here, 0은 모든 것이 자신의 인덱스

    의 각 파일이있다

파일 갔을 때 0

Array 
( 
    [userFile1] => Array 
    (
     [name] => i_love_ponies.png 
     [type] => image/png 
     [size] => 42233 
     [tmp_name] => /tmp/_x123tfsdayx134 
     [error] => 0 
    ) 
    [userFile2] => Array 
    (
     [name] => ponies_run_my_server.png 
     [type] => image/png 
     [size] => 12325 
     [tmp_name] => /tmp/_x3123asdad3ssy 
     [error] => 0 
    ) 
) 

몇 가지 추가 힌트

당신이 큰 파일을 기대하는 경우, 웹 서버 및 PHP는 실행 시간 제한을 고려하십시오. 업로드하는 데 10 분이 걸리면 사용자가 실수로 끝내지 않게 할 수 있습니다.

PHP에서 당신은 max_execution_time

2를 증가시킬 수있다.내가 파일의 종류를 받는가 - 검증

질문 당신은

내가 특정 파일을 허용 하시겠습니까 문의 할 수 있습니다?

$_FILES 배열에있는 유형은 브라우저에서 설정합니다. 어떤 유형이 업로드되었는지 확인하려면 fileinfo extension PHP를 사용할 수 있습니다.

이 예는

$allowedTypes = array(
    'image/png' 
    'image/gif' 
    'image/jpeg' 
); 

$useFiles = array(); 

$finfo = new finfo(FILEINFO_MIME_TYPE); 
foreach ($_FILES as $index => $file) 
{ 
    if ($file['error'] === UPLOAD_ERR_OK) { 
     $type = $finfo->file($file['tmp_name']); 
     if (in_array($type, $allowedTypes)) { 
      $useFiles[$index] = $file; 
     } 
    } 
} 

내가 최대 파일 크기를 설정 하시겠습니까 furter 처리를위한 신선한 배열에 허용 된 유형의 파일을 업로드 자체의 성공 여부를 확인하고 작성합니다 - 크기는 무엇인가 ?

이 경우 안전하게 $_FILES['key']['size'] 값 (바이트 단위)을 사용할 수 있습니다. 클라이언트 측 세트의 파일 크기 제한에 의존해서는 안되며 이미지에 대해 이야기 할 경우 이미지 크기를 조정하거나 축소판을 만들려면 이미지 크기는 무엇입니까?

은 당신이 그것으로 어떤 처리를 수행 할 수 있습니다 최종 위치의에 파일을 저장하기 전에 이미지 크기

3. 처리

를 결정하는 getimagesize에서보세요. 즉,

공통 라이브러리를 당신의 .xxx에 변환 할 수있는 해결책을 찾을 확신하지 것은 gd libimagick 있습니다. 개인적으로 나는 gd lib를 선호합니다. 좀 더 수동 작업이지만 더 빠르며 대부분의 설치가 기본적으로 제공되거나 추가로 설치하기 쉽습니다. 있는 Imagemagick는 기본적으로 지금은 기억에 대해 이야기하는 시간이다 이미지 처리 기능의 아주 큰 수영장

4. 저장 데이터

있습니다. 먼저 임시 파일을 임시 또는 최종 위치로 복사하는 저장 방법.

당신은 저장에 대한 "가장 좋은 방법은"없다, 다시 move_uploaded_file

move_uploaded_file($useFiles['tmp_name'], $destination); 

를 사용한다, 이것은 환경, 파일 및 사용 방법에 따라 달라집니다.나는 약간에 대해서 이야기 할 것이다.

4.1. 서버 파일 시스템

이것은 아마도 파일을 저장하는 데 가장 간단하고 간단한 방법입니다. 이미 실행중인 웹 서버에서 정적으로 파일을 제공 할 수 있습니다. 이것은 대개 문서 루트 내의 위치입니다.

사용자의 편의를 위해 파일 이름을 데이터베이스에 저장할 수 있습니다. 사용자 또는 위치와 같은 연결된 데이터를 참조하거나 참조하는 것이 더 바람직합니다.

다양한 이유로 같은 폴더에 모든 파일을 저장하면 안됩니다.

각 파일마다 고유 한 이름을 생성해야합니다. 그렇지 않으면 기존 파일을 새 파일로 덮어 씁니다. 또한 일반적인 파일 시스템은 노드의 파일 양이 증가함에 따라 탐색 속도가 느려지고 있습니다. 결과적으로 파일 배달 요청시 응답 시간이 느려집니다.

당신이 깊은 폴더 구조를

예를 얻기 위해 당신이 filname의 체크섬을 나눌 수있는 사용자 당 많은 파일을 기대하는 경우 각 사용자

/uploaded/user-id/file.jpg 

의 폴더에 저장할 수

$path = $_SERVER['DOCUMENT_ROOT'] . '/uploaded/' . $userId . '/' . chunk_split(md5($useFiles['index']['name']), 12, '/'); 

는에

/var/www/htdocs/uploaded/1/97e262286853/d52aa8c58eb7/f0431f03/ 

4.2를 초래할 것입니다. 데이터베이스

blob 유형을 사용하여 파일을 MySQL 데이터베이스에 저장할 수 있습니다. 일반적으로 권장하지 않습니다.

4.3. 콘텐츠 전송 네트워크

전 세계에서 많은 트래픽이 발생할 것으로 예상되는 경우 파일을 CDN에 Amazon S3 (Cloudfront 포함)으로 저장하는 것이 좋습니다.

S3는 5TB에 파일을 백업을위한 저렴하고 신뢰할 수있는 저장 (내가 아는까지로)

http://www.9lessons.info/2012/08/upload-files-to-amazon-s3-php.html

당신은 파일 백업, 사용 가능한 하드 디스크 크기, 전송 속도 등에 대해 걱정할 필요가 없습니다 것입니다 Cloudfront은 전세계 모든 가장자리 위치로 S330 위에 CDN 레이어를 추가합니다.

관련 문제