이것은 실제로 웹 응용 프로그램에서 일반적입니다. 나는 구체적인 세부 사항이 없기 때문에 생각하고 일반적인 제안을 해 줄 것입니다.
당신이하고 싶지 않은 일은 업로드 한 바이트를 데이터베이스에 저장하는 것입니다. 그것은 가능하지만, 특히 사람들이 임의의 크기의 파일을 업로드 할 수있는 곳에서는 잘 수행하는 것이 매우 어렵습니다. 전에이 너트에 금이 간다면, 나는 가장 높은 추상화에서 시작을 말할 것입니다. 사용자는 파일을 업로드 할 수 있으며 파일의 위치와 함께 URL이 반환됩니다. 따라서 사용자는 파일을 POST하고 새 파일의 URL이있는 201/204의 응답을받습니다. 소켓을 사용하는 경우에도 동일한 유형의 클라이언트 및 플랫폼 유형으로 동일한 서비스를 롤백 할 수 있도록 HTTP 기반 접근 방식을 고려할 것입니다. 그러나 소켓에서 매우 효율적인 구현을 작성할 수 있습니다.
소켓 또는 HTTP 요청 중 하나는 서버 측에서 다음과 동일합니다. 서버 측에는 파일 ID와 사용자를 취하는 FileLocator와 같은 인터페이스가 있습니다. FileSystemFileLocator는 FileLocator를 구현하고 파일 시스템에서 파일을 찾습니다. 까다로운 부분은 디렉터리에 약 1,000 개 정도의 디렉터리 또는 개체를 넣는 것이 아닙니다. 일반적인 기술 (각 파일에 고유 한 번호를 지정하는 경우)은 0을 입력하고 숫자를 반대로하여 12 개의 숫자로 만듭니다. 세 자리의 각 블록은 디렉토리 이름이되고 마지막 세 개는 파일 이름 : /123/400/000/000.pdf입니다. 예쁜 파일 이름을 되 찾으려면 데이터베이스에서 위치, 원래 파일 이름 및 일부 메타 데이터를 추적합니다.
그런 다음 S3를 사용하여 파일을 저장하는 S3FileLocator를 구현할 수 있습니다. MongoFileLocator를 사용하여 mongo 등에 데이터를 저장하십시오. 데이터베이스의 메타 데이터 (매우 빠르게 액세스 할 수 있음)가 파일 시스템이나 S3의 현실과 동기화되도록하는 방법을 파악해야합니다 .
파일을 읽을 때 파일의 작은 덩어리 (예 : 16k) 만 읽은 다음 완료 될 때까지 루프에 사용자에게 반환합니다. 파일을 한꺼번에 읽으면 매우 비효율적으로 메모리를 사용하게됩니다. 예를 들어 한 프로젝트에서 SQL Server 테이블의 파일을 메모리로 읽은 다음 메모리에 파일을 복사하여 개체를 클라이언트에 다시 쓰는 방식으로 구현했습니다. 데이터베이스에는 50MB의 파워 포인트 프레젠테이션이 포함되었습니다.
무엇이 당신을 혼란 스합니까? HTTP vs FTP 대 일반 소켓은 정말로 중요하지 않습니다. 단지 하나만 선택하십시오. (비록 내가 FTP에 대해 조언 할 것이지만, 방화벽과 네트워크 터널을 다루는 것이 더 힘들어진다.) – Joni
@Joni, 귀하의 의견에 감사드립니다. 나는 DropBox의 개념을 좋아했다. HTTP를 통해 DropBox 같은 기능을 구현할 수 있습니까? 또는 어떤 것이 더 낫습니까? –