2009-11-24 6 views
1

변환 된 버전의 사용자 업로드 이미지 (회전, 잘라 내기 및 워터 마크)를 제공하는 MVC 애플리케이션을 작성 중입니다. 변환이 지정되면 변경, 그래서 생성 된 출력을 적극적으로 캐시하고 가능한 효율적으로 제공하고 싶습니다.ASP.NET MVC에서 생성 된 이미지를 효율적으로 캐싱

변환 옵션은 데이터베이스에 저장되며 필요에 따라 이미지를 만들기 위해 이미지 서버에서 사용됩니다. 원래 업로드 만 영구적으로 저장됩니다. 생성 된 이미지를 로컬 디렉터리에 캐시하면 IIS 7이 ASP.NET 프로세스를 건드리지 않고 즉 경로를 일치시킴으로써 IIS 7을 픽업 할 수 있습니다. images/의 정적 이미지가 동적 MVC 경로 /images/{id}.jpg보다 우선합니다.

이 시점에서 사용자가 실제로 변형 옵션을 변경하면 이미지가 다시 생성되어야하지만 이미지를 수동으로 삭제하지 않아도됩니다. 마지막으로 수정 한 필드를 데이터베이스에 저장하므로 해당 타임 스탬프를 URL에 추가 할 수 있습니다 (예 : http://images.example.com/images/153453543.jpg?m=123542345453. 캐시 캐싱이 매개 변수 m에 의해 출력 캐시를 변경할 수 있지만, 대량의 이미지를 처리해야하므로 오히려이를 피하는 것이 좋습니다.

일부 조건이 충족되는 경우 정적 파일을 지우는 지능적인 방법이 있습니까?

답변

2

누군가가 이미지를 요청할 때마다 ASP.NET 코드를 호출하지 않으려면 변환을 업데이트 할 때 이미지를 삭제하는 것이 좋습니다. 비교적 캐시가 없으므로 상대적으로 "자유"이며 필요한 경우 다시 생성됩니다.

사용자가 이미지 속성을 업데이트 할 때 실제로 변환이 변경되었지만 사용자가 얼마나 자주 변경하는지 추적하는 데 관심이있을 수 있습니다. 이미지를 자주 재생성해야 할 필요가 있다면 중요합니까?

파일 이름 자체에 타임 스탬프를 포함 할 수 있습니다 (예 :

http://images.example.com/images/153453543_20091124120059.jpg. 

그런 식으로 업데이트 할 때 이미지를 삭제하지 않아도됩니다. 그러나 오래된 구식 파일을 남겨 둡니다 ...

+0

데이터베이스 행을 업데이트 할 때 캐싱 된 파일을 삭제해야 할 수도 있지만 결국 두 가지 문제를 분리하여 보관하는 것이 좋습니다. 내 "멍청한"이미지 옵션 모델은 내 캐싱 메커니즘에 대해 알 필요가 없어야합니다. 오래된 이미지의 흔적을 남기려면 큰 문제가됩니다. 또한 이미지 옵션은 이미지가 업로드 된 직후 실제로 변경됩니다. 변경 사항은 점진적으로 커밋되기 때문에 (ajax 이상). –

+1

이미지 옵션 모델에 OnTransformationUpdate 이벤트를 추가하지 않는 이유는 무엇입니까? 그런 다음 캐시 솔루션이 이벤트에 연결하여 적절한 캐시 이미지를 삭제할 수 있습니다. – ebrown

+0

ebrown : 캐시 솔루션이 다른 서버에서 실행되고 이미지 업로드 및 데이터베이스 옵션 업데이트를 처리하는 웹 서버가 ASP 클래식과 ASP.NET을 혼합하여 실행하며 구조적으로 불건전합니다. 이 부분들을 분리하여 보관하고 싶습니다. –

1

각 요청이 아닌 해당 설정이 변경 될 때마다 물리적 이미지를 생성하는 프로세스를 실행하지 마십시오.

+0

내 이미지 업로드 코드를 덤프로 간단하게 유지하고 싶습니다. 이미지 서버로 이미지를 푸시해야합니다. –

관련 문제