최고의 장소에 저장하기 위해 업로드한 이미지,SQL 데이터베이스는 디스크 파일 시스템입니까?

StackOverflow https://stackoverflow.com/questions/348363

문제

나는 응용 프로그램을 작성할 수 있는 사용자의 이미지를 업로드하려면 서버에.제가 기대에 대한 20 이미지 하루에 모든 jpeg 아 편집/크기가 조정됩니다.(이것은 다른 질문이 얼마나 크기를 조정하는 이미지를 서버측에서 저장하기 전에.어쩌면 사람이 할 수 있을 삭제하시기 바랍니다.NET 리소스에 대한 의견 또는 그래서).내가 궁금해 지금 무엇이 가장 좋은 장소 저장하기 위해 업로드한 이미지입니다.

  • 저장소의 이미지 파일로 파일 시스템에서 만들 테이블에 있는 레코드와 함께 정확한 경로는 이미지입니다.

  • 또,이미지를 저장에 자체에 테이블을 사용하여"이미지"또는"바이너리"데이터를 데이터 형식의 데이터베이스 서버입니다.

나는 장단점이 있습니다.아)내가 할 수 있기 때문에 쉽게 위치를 파고 그냥을 변경하는 테이블 항목입니다.다른 한편으로 좋아하지 않는 저장하는 비즈니스 데이터에서 웹 서버 및 내가 정말 원하지 않을 연결하는 웹 서버의 다른 데이터 소스를 보유하는 비즈니스 데이터(보안상의 이유로) 나는 다음과 같 b)기 때문에 모든 정보를 한 곳에서 쉽게 액세스할 수 있습니다.다른 한편으로는 데이터베이스를 얻을 것이 매우 크다.아웃소싱하는 데이터가 더욱 어려워질 수 있습니다.

도움이 되었습니까?

해결책

나는 일반적으로 파일 시스템에 파일을 저장합니다. 예외가 있지만 그 이유는 존재하기 때문입니다. 파일의 경우 파일 시스템은 가장 유연하고 성능이 뛰어난 솔루션입니다 (일반적으로).

데이터베이스에 파일을 저장하는 데 몇 가지 문제가 있습니다. 파일은 일반적으로 평균 행보다 훨씬 큽니다. 많은 큰 파일을 포함하는 결과는 많은 메모리를 소비합니다. 또한 쓰기 용 테이블 잠금 장치 (예 : ISAM)를 사용하는 저장 엔진을 사용하는 경우 저장하는 파일의 크기 / 속도에 따라 파일 테이블이 자주 잠겨있을 수 있습니다.

보안과 관련하여 - 일반적으로 파일을 문서 루트 외부에있는 디렉토리에 저장하고 (HTTP 요청을 통해 액세스 할 수 없음) 먼저 적절한 권한을 확인하는 스크립트를 통해 제공합니다.

다른 팁

옵션 B의 유일한 이점은 하나의 시스템에 모든 데이터를 갖는 것입니다. 그러나 그것은 잘못된 이점입니다! 코드는 또한 데이터의 형태라고 주장 할 수 있으므로 데이터베이스에 저장 될 수 있습니다. 어떻게 원하십니까?

고유 한 사례가 없다면 :

  • 비즈니스 로직은 코드에 속합니다.
  • 구조화 된 데이터는 데이터베이스 (관계형 또는 비 관계형)에 속합니다.
  • 대량 데이터는 스토리지 (파일 시스템 또는 기타)에 속합니다.

Files, Code, Data

파일을 보관하기 위해 파일 시스템을 사용할 필요는 없습니다. 대신 클라우드 스토리지 (예 :)를 사용할 수 있습니다 아마존 S3) 또는 그 위에 서비스 인프라 (예 : 업로드 케어):

https://uploadcare.com/upload-api-cloud-storage-and-cdn/

그러나 데이터베이스에 파일을 저장하는 것은 나쁜 생각입니다.

Flickr는 파일 시스템을 사용합니다. 그들은 이유를 논의합니다 여기

우리는 고객이 옵션 B (데이터베이스 스토리지)에 대해 몇 가지 다른 백엔드에 대해 몇 차례 고집하도록했으며, 우리는 언제나 결국 옵션 A (파일 시스템 저장소)로 돌아갑니다.

그런 큰 블로브는 SQL Server 2005에 의해서도 충분히 처리되지 않았습니다. 이것은 우리가 시도한 최신 제품입니다.

구체적으로, 우리는 심각한 팽창을 보았고 아마도 문제를 잠그는 것 같습니다.

또 다른 참고 사항 : NTFS 기반 스토리지 (Windows Server 등)를 사용하는 경우 수천 개의 파일을 하나의 디렉토리에 넣는 방법을 찾는 것을 고려할 수 있습니다. 왜 그런지 잘 모르겠지만 때로는 파일 시스템이 그 상황에 잘 대처하지 않습니다. 누구든지 이것에 대해 더 많이 알고 있다면 나는 그것을 듣고 싶습니다.

그러나 나는 항상 하위 디렉토리를 사용하여 물건을 조금 분해하려고합니다. 생성 날짜는 종종 다음에 잘 어울립니다.

이미지/2008/12/17/.jpg

... 이것은 괜찮은 수준의 분리를 제공하며 디버깅 중에 약간의 도움이됩니다. Explorer와 FTP 고객 모두가 정말 큰 디렉토리가있을 때 약간 질식 할 수 있습니다.

편집하다: 최신 버전의 SQL Server에서 2017 년의 빠른 메모에 따르면 논의한 단점을 피해야 할 많은 블로브를 처리하는 새로운 옵션이 있습니다.

최근에 PDFS/Word 파일을 MySQL 테이블에 저장하는 PHP/MySQL 앱을 만들었습니다 (지금까지 파일 당 40MB).

장점 :

  • 업로드 된 파일은 다른 모든 것과 함께 백업 서버로 복제됩니다. 별도의 백업 전략이 필요하지 않습니다 (마음의 평화).
  • 업로드/ 폴더가없고 모든 응용 프로그램에 어디에 있는지 알려줄 필요가 없기 때문에 웹 서버를 설정하는 것이 약간 간단합니다.
  • 데이터 무결성을 향상시키기 위해 편집을 위해 트랜잭션을 사용해야합니다 - 고아 및 누락 된 파일에 대해 걱정할 필요가 없습니다.

단점 :

  • MySqlDump는 이제 테이블 중 하나에 500MB의 파일 데이터가 있기 때문에 LOOOON 시간이 걸립니다.
  • 파일 시스템과 비교할 때 전반적으로 메모리/CPU 효율적이지 않습니다.

나는 내 구현을 성공이라고 부르며, 백업 요구 사항을 관리하고 프로젝트의 레이아웃을 단순화합니다. 앱을 사용하는 20-30 명의 사람들에게는 성능이 좋습니다.

이전 게시물입니다.그러나 많은 방문객들은 이 페이지를 얻고 있는것과 관련된 질문입니다.특히 초보자.

을 업로드하는 방법과 이미지를 저장하거나 파일에서 우리의 웹 사이트:

정적 웹사이트가 어쩌면 문제가 없으므로 이 파일을 저장에 대한 일부 공 호스팅 여전히 충분하다.문제에서 동적인 웹사이트를 할 때 그것은 더 가져옵니다.크 데이터베이스에서 처리할 수 있지만,더 큰에서 같은 파일을 이미지가 문제가 된다.두 가지 유형의 이미지를 웹 사이트:

  1. 이미지에서 온 관리자를 위한 동적 블로그입니다.일반적으로,이러한 이미지는 최적화되기 전에 업로드 할 수 있습니다.

  2. 에서 이미지를 사용자의 경우에는 사용자가 허용된 이미지를 업로드 등과 같습니다.또는 사용자가 만들 수 있는 블로그 콘텐츠를 넣어 일부 이미지에서 텍스트 편집기입니다.이 종류의 이미지 예측하기 어렵니다.사용자는 업로드 할 수 있습 큰 이미지를 그냥 작은 컨텐츠에 의해 크기를 조절 보기 크기가 아니지만의 크기를 조정합니다.

을 무시하여 항목이 없습니다.1 위,빠른 해결책에 대한 항목이 없습니다.2 될 수 있는 임시 해결해 다음과 같은 끝 없는 경우에 우리는 이미지를 최적화하는 기능에서 우리의 웹 사이트:

  1. 을 허용하지 않는 사용자가 직접 업로드에서 텍스트 편집기로 리디렉션하는 방법으로 이미지 갤러리도 있습니다.이 페이지에서 사용자는 파일 업로드하기 전에 사전에 그에 포함된 내용입니다.이 방법이라고 파일 관리자입니다.

  2. 사용하기 이미지 기능 사용자를 위한 이미지를 업로드 할 수 있습니다.이 제한의 이미지 크기에도 사용자로 업로드 매우 큰일이다.최종 이미지의 결과 이미지를 잘립니다.우리는 할 수 있을 정의 크기에 서버의 측면 및만 허용 예를 들어 500Kb 니다.

지금,그것은 단지 일시적입니다.에 대한 최종 해결,질문을 반복한다:

  • 을 처리하는 방법에 큰 이미지를 저장?
  • 의 크기를 조정 또는 변경의 확장명은.
  • 얼마나 큰 중 웹사이트나 전자상거래 처리하는 파일 저장을 위해 자신의 이미지?

우리가 무엇을 할 수 있는 그런 다음:

  1. 마이그레이션에서 공유 VPS 호스팅.충분하지?다음은 더 높은 업그레이드하여 헌신적입니다.

  2. 자신의 서버를 만들에 대한 파일을 저장합니다.인터넷 검색을 그것을 할 수 있습니다.이것은 당신이 생각하는 것처럼 어려운 일이.어떤 사람들을 위해 그것을 할 수 그들의 웹 사이트입니다.

  3. 쉬운 방법이 사용 CDN 파일 저장 서비스입니다.

Okay,1 및 2 는 조금 비싸다.만 아니 3 나는 생각한 최고의 솔루션입니다.

일부 CDN 서비스를 저장할 수 있으로 많은 웹 파일을 당하고 싶습니다.

질문,"업로드하는 방법 파일의 CDN 에서 우리의 웹사이트가 있는가?"

걱정하지 마세요,당신이 등록되면,일반적으로 무료이며,당신을 얻을 것이 안내하는 방법 파일 업로드하고 그들의 링크에서 당신의 웹 사이트입니다.당신을 얻을 것이 API and more.그것은 간단합니다.

일부 공급자는 우리에게 무료로 서비스를 위한 14 일으로 제한된 저장 및 대역폭을 제공합니다.하지만 하는 것이 좋을 위한 출발점입니다.전기 때문에'사람은 결코 시도'.

도움이 될 것입니다 바랍니다에 대한 초보자.

내 웹 사이트에서 업로드 된 이미지를 사용하고 옵션 A를 확실히 말할 것입니다.

내가 강력히 추천하는 또 하나의 것은 사용자가 사진의 이름에서 파일 이름을 즉시 변경하고 더 관리 가능한 것으로 바꾸는 것입니다. 예를 들어, 각 그림을 고유하게 식별 할 날짜와 시간이있는 것.

또한 미래의 합병증을 피하기 위해 이상한 문자의 사용자의 파일 이름을 제거하는 데 도움이됩니다.

이미지를 확실히 조정하고 가능하다면 형식을 확인하십시오. 예를 들어, 무의미한 호스트가 업로드하고 제공되는 악의적 인 파일이 있습니다. gifar 취약성을 통해 GIF 파일에 악의적 인 Java 애플릿을 숨길 수 있었으며 현재 컨텍스트에서 쿠키를 읽고 다른 사이트로 보낼 수 있습니다. 이미지 크기를 조정하면 일반적으로 임베디드 코드를 마시기 때문에이를 방지합니다. 이 공격은 JVM 패치에 의해 수정되었지만, 이진 파일을 세탁하지 않고 순진하게 제공하면 모든 취약점까지 열립니다.

대부분의 바이러스 스캐너는 파일 시스템에 대해서만 실행할 수 있습니다. DB에 바이너리를 저장하면 스캐너를 매우 쉽게 실행할 수 없습니다.

대부분의 구현은 옵션 A입니다.

옵션 B를 사용하면 데이터베이스에서 해당 비트를 브라우저에 표시 할 수있는 것으로 마샬링 할 때 큰 캔의 전체 캔을 열어줍니다. 또한 DB가 다운되면 이미지를 사용할 수 없습니다.

나는 공간이 너무 많은 문제라고 생각하지 않습니다 ... Terabyte 드라이브는 이제 수백 달러입니다.

옵션 B를 수행 할 시간이나 자원이 없기 때문에 옵션 A로 구현하고 있습니다.

자동 크기 조정을 위해 imagemagick을 사용해보십시오 ... 많은 주요 오픈 소스 컨텐츠/사진 관리 시스템에 사용됩니다.

SQL Server 2008에는 FILESTREAM 데이터 유형 그것은 on에 대해 이야기했습니다 Runas Radio #74, 이것은 두 세계의 최고와 비슷합니다. 대부분의 사람들은 2008 년의 ot을 가지고 있지 않지만, 그렇다면이 옵션은 꽤 멋져 보입니다.

이것은 기본적으로 내가합니다.

  1. 업로드 된 이미지를 임시 디렉토리 또는 메모리에 저장하십시오.
  2. 영구적으로 저장하기 전에 해당 이미지를 처리하십시오. 2.1. 색 보정 2.2. 압축 2.3. 이미지 크기 2.4에 따라 여러 사본을 만듭니다. .xl, .lg, .md, .sm 등의 이름 바꾸기 접미사
  3. 폴더 이름이있는 폴더 내에 처리 된 모든 이미지 파일 (단일 파일에서)을 포장합니다. id 모든 행/문서와 함께 데이터베이스에 저장됩니다. image file name (또는 이미지 이름으로 임의 이름 일 수 있습니다).
  4. 만들다 yyyy/mm/d path 폴더가 존재하지 않는 경우. 예를 들어 2016/08/21. 동일한 문서와 행에 대한 경로와 데이터베이스에 저장하십시오.
  5. 이미지를 움직입니다 id 폴더로 path 폴더. (Path 폴더는 /var /web-content 폴더에있을 수 있습니다.)
  6. 메모리 버퍼를 플러시하거나 임시 파일을 삭제합니다.

문서에 언급 된 이미지에 액세스 해야하는 경우 이미지가 포함 된 것보다 폴더의 경로와 ID가 있습니다. 예를 들어 /var/web-content/{{path}}/{{id}}/image-file-name.sm.jpg

이 방법으로 처리 된 모든 이미지 파일을 삭제 해야하는 경우 폴더를 삭제하면 컨텐츠를 재귀 적으로 삭제하십시오.

우리는 A를 사용합니다. 나는 그것을 공유 드라이브에 넣을 것입니다 (둘 이상의 서버를 실행하지 않는 한).

이것이 당신을 위해 확장되지 않을 때가되면 캐싱 메커니즘을 조사 할 수 있습니다.

절대적으로, 긍정적 인 선택 A. 다른 사람들은 데이터베이스가 일반적으로 블로브를 잘 다루지 않도록 설계되었는지 여부에 관계없이 잘 다루지 않는다고 언급했습니다. 반면에 파일 시스템은이 물건을 위해 산다. RAID 스트라이핑을 사용하고 여러 드라이브에 이미지를 퍼뜨리는 옵션이 있습니다.

또 다른 장점은 데이터베이스 백업/복제가 괴물이라는 것입니다.

옵션 A.

이미지가로드되면 저장하기 전에 형식을 확인하고 크기를 조정할 수 있습니다. 이미지 크기를 조정하기위한 많은 .NET 코드 샘플이 있습니다. http://www.codeproject.com. 예를 들어: http://www.codeproject.com/kb/cs/photo_resize.aspx

보안상의 이유로 인해 발생하는 문제를 피하는 것이 가장 좋습니다. IE의 내용 스니핑 이를 통해 공격자는 이미지 파일 내부에서 JavaScript를 업로드 할 수 있으며, 이는 사이트의 맥락에서 실행될 수 있습니다. 따라서 이런 종류의 공격을 방지하기 위해 저장하기 전에 이미지를 변환 (작물/크기 조정) 할 수 있습니다. 이 답변 다른 아이디어가 있습니다.

글쎄, 사용자가 서버에 파일을 업로드하는 비슷한 프로젝트가 있습니다. 내 관점에서, 옵션 A)는보다 유연하기 때문에 최상의 솔루션입니다. 해야 할 일은 하위 디렉터로 분류 된 보호 된 폴더에 이미지를 저장하는 것입니다. 컨텐츠는 실행 스크립트 (매우 중요)가 없어야하고 HTTP 요청에 적합하지 않도록 보호 된 (읽기, 쓰기) 관리자가 기본 디렉토리를 설정해야합니다.

이것이 도움이되기를 바랍니다.

편집 할 필요가없는 작은 파일 인 경우 옵션 B는 나쁜 옵션이 아닙니다. 나는 이것을 파일을 저장하고 미친 디렉토리 구조 문제를 처리하기 위해 논리를 작성하는 것보다 선호합니다. was 많이 하나의 디렉토리의 파일은 나쁘다. 엠 케이?

파일이 크거나 특히 Office와 같은 프로그램에서 일정한 편집이 필요한 경우 옵션 A가 최선의 방법입니다.

대부분의 경우 선호도의 문제이지만 옵션 A로 이동하면 디렉토리에 파일이 너무 많지 않게하십시오. 옵션 B를 선택하면 Blobed Data가있는 테이블을 자체 데이터베이스 및/또는 파일 그룹으로 만듭니다. 이는 유지 보수, 특히 백업/복원에 도움이됩니다. 일반 데이터는 아마도 상당히 작고 이미지 데이터는 거대한 시간이 지남에 따라.

따라서 귀하의 요구 사항,특히 양,사용자와의 주파수를 검색합니다.하지만 작거나 중간 사무실,최고의 옵션을 사용하여 응용 프로그램을 사용하는 애플과 같은 사진이나 Adobe Lighroom.그들은 전문하여 저장,카탈로그,인덱스 구성의이 종류는 리소스입니다.그러나,대규모 조직에서 강한 요구 사항을 저장하고 높은 수의 사용자가 추천 인스턴스화 콘텐츠 관리 plataform 디지털 자산 관리 다음과 같 Nuxeo 또는 야외;모두 제공하는 아주 좋은 자원이 관리하는 매우 많은 양의 데이터 간단한 방법을 가져올을니다.고,매우 중요하다:가 무료(오픈 소스)옵션 모두에 대한 플랫폼입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top