건설 사진대장을 Azure Blob Storage 이름 규칙으로 정리하기
Claude Code로 현장 사진 이름, Blob index tags, 공유 URL, 보관 규칙을 점검합니다.
건설 현장 사진이 IMG_4821.jpg 그대로 쌓이면 준공 서류를 만들 때 바로 막힙니다. 공사 번호는 칠판에 있고, 공정 메모는 채팅에 있고, 발주처는 방수 전후 사진만 요구합니다. Azure Blob Storage에 이름 규칙과 태그 없이 올리면 사무실은 다시 채팅을 뒤집니다. 첫 작업은 최근 현장 사진 100장을 점검하는 것입니다.
Key Points
- 카메라 파일명에 의존하지 않습니다.
- projectId, 공정, 위치, 상태, 날짜, 순번을 나눕니다.
- 검색은 Blob index tags, 보조 정보는 metadata로 둡니다.
- Claude Code는 이름 규칙, CSV, 위험 목록을 만듭니다.
- 사람은 고객명, 주소, 얼굴, 차량번호, 계약, 공개 승인을 확인합니다.
Workflow: Photo Ledger Before Upload
출발점은 Azure Portal이 아니라 사진 목록입니다. 폴더, 현재 이름, 날짜, 공정, 위치, 제출처, 공개 여부를 표로 만듭니다. Claude Code는 그 표에서 Blob 경로 규칙, 필수 태그, 검토 CSV를 제안합니다.
| Field | Example | Review point |
|---|---|---|
| Blob name | 2026/07/site-042/waterproof/20260719_roof_before_001.jpg | readable path without customer details |
| Blob index tags | projectId, phase, location, status, publicOk | searchable keys with stable spelling |
| Metadata | source=line, shotBy=staff-01 | import support, not sensitive identity |
| Ledger CSV | URL, phase, destination, approval | human review before submission |
Primary sources checked: Azure Blob Storage introduction, naming rules, Blob index tags, lifecycle management, soft delete, and SAS overview.
What Claude Code Does And What Humans Decide
Claude Code can draft naming rules, required tags, missing-field checks, CSV columns, shared-link checks, and retention notes from a sample folder. Humans decide customer names, addresses, faces, license plates, neighboring homes, accident photos, contracts, publication approval, and deletion requests.
3 Use Cases
Use case 1: Create a naming rule for site photos
- Input: existing folders, photo names, project ID, phase, location, shot date, destination.
- Output: blob-name template, sequence rule, banned labels, CSV columns.
- Human review: customer names, addresses, and site labels that should not appear in URLs.
Start with one recent site and one hundred photos. Ask Claude Code to turn the list into a naming rule. The human reviewer removes sensitive labels before upload.
Use case 2: Search with Blob index tags
- Input: projectId, phase, location, status, shotDate, submittedTo, publicOk.
- Output: required tags, search examples, empty-field rule, spelling dictionary.
- Human review: no personal data, customer names, addresses, phone numbers, or license plates in tags.
Tags make later search practical. A query by project and phase is easier than scanning camera filenames. Keep tag values short and internal.
Use case 3: Review shared URLs
- Input: photos to share, recipient, expiry, permission, email text, submission deadline.
- Output: SAS checklist, expiry warning, share list, send-before review.
- Human review: recipient, read-only permission, expiry, people in photos, contract details.
Shared URLs reduce back-and-forth, but wide links create risk. Claude Code prepares the table. Humans approve the scope.
Copy-Paste Prompt
Act as a construction photo ledger reviewer.
Goal: make Azure Blob Storage photos searchable without exposing customer or site-sensitive data.
Check:
1. blob names include project, date, phase, location, status, and sequence
2. customer names, addresses, people, and license plates are not placed in URLs or tags
3. Blob index tags and metadata have separate purposes
4. shared URLs are read-only, short-lived, and narrow in scope
5. soft delete, versioning, and lifecycle notes exist
6. a ledger CSV lets humans approve publication
Return a naming rule, required tag table, CSV columns, risky file-name examples, and a 100-photo first review plan.
Working Check Code
// verify-construction-photo-ledger.mjs
// No dependencies. Run with: node verify-construction-photo-ledger.mjs
const photos = [
{
blobName: "IMG_4821.jpg",
tags: { projectId: "site-042", phase: "waterproof" },
metadata: { source: "line" },
share: { permission: "read", expiresInHours: 240 }
},
{
blobName: "2026/07/site-042/waterproof/20260719_roof_before_001.jpg",
tags: {
projectId: "site-042",
phase: "waterproof",
location: "roof",
status: "before",
publicOk: "review"
},
metadata: { source: "camera", shotBy: "staff-01" },
share: { permission: "read", expiresInHours: 24 }
},
{
blobName: "sato-home-address-kyoto-crack-after.jpg",
tags: { projectId: "sato-home", phase: "repair", publicOk: "yes" },
metadata: { customerName: "Sato" },
share: { permission: "write", expiresInHours: 72 }
}
];
const requiredTags = ["projectId", "phase", "location", "status", "publicOk"];
const blobNamePattern = /^\d{4}\/\d{2}\/[a-z0-9-]+\/[a-z0-9-]+\/\d{8}_[a-z0-9-]+_(before|after|progress)_\d{3}\.(jpg|jpeg|png)$/i;
const sensitiveWords = /(address|customer|home|name|phone|car|license|住所|氏名|電話|車番)/i;
const problems = [];
for (const photo of photos) {
if (!blobNamePattern.test(photo.blobName)) {
problems.push({ blobName: photo.blobName, item: "blob name", fix: "use yyyy/mm/project/phase/date_location_status_seq.ext" });
}
for (const tag of requiredTags) {
if (!photo.tags[tag]) {
problems.push({ blobName: photo.blobName, item: `missing tag: ${tag}`, fix: "fill required Blob index tags before upload" });
}
}
if (sensitiveWords.test(photo.blobName) || sensitiveWords.test(JSON.stringify(photo.tags)) || sensitiveWords.test(JSON.stringify(photo.metadata))) {
problems.push({ blobName: photo.blobName, item: "sensitive label", fix: "remove customer names, addresses, phone numbers, and car identifiers" });
}
if (photo.share.permission !== "read") {
problems.push({ blobName: photo.blobName, item: "share permission", fix: "use read-only sharing for external photo review" });
}
if (photo.share.expiresInHours > 48) {
problems.push({ blobName: photo.blobName, item: "share expiry", fix: "shorten SAS expiry for temporary construction photo review" });
}
}
if (problems.length > 0) {
console.table(problems);
process.exitCode = 1;
} else {
console.log("Construction photo ledger checklist passed.");
}
Pitfall: Common Failure Cases
The first failure is forcing every detail into the filename. Split the blob name, tags, metadata, and CSV. The second failure is putting private labels into tags. Use internal project IDs. The third failure is a long-lived broad shared URL. Use read-only, short expiry, and narrow scope. The fourth failure is using one retention rule for handover photos, warranty photos, accident photos, and temporary chat imports.
FAQ
Q. Can all photos live in one container?
A. Often yes at the beginning. Compare containers or prefixes when permissions and retention diverge.
Q. What belongs in Blob index tags?
A. Search keys: projectId, phase, location, status, and publicOk. Use metadata for support notes.
Q. Are SAS URLs safe?
A. They are useful for temporary review when read-only, short-lived, and narrow in scope.
Q. What should the team do today?
A. Pick one recent site and check one hundred photos for blob name, projectId, phase, location, status, and publicOk.
Training And Consultation Signal
Measure search time, resend requests, empty CSV fields, photos stopped before submission, expired shared links, and inquiry rate. If those numbers hurt, photo-ledger design and Blob Storage permissions are a fit for ClaudeCodeLab training.
What I Verified
I checked Microsoft Learn references for Blob Storage, naming, Blob index tags, lifecycle management, soft delete, and SAS. I also checked the CTA, executable JavaScript, internal link, external links, locale coverage, and queue removal.
관련 글
Claude Code로 건설회사 시공사례 페이지 정리하기
시공 사진, 공정 메모, 게재 허가, 견적 CTA를 정리해 문의로 이어지는 사례 페이지를 만듭니다.
건설업 견적서와 현장 일보를 Claude Code로 초안 작성하는 실무 절차
소규모 건설사 현장 소장·대표를 위한 글. 견적서와 현장 일보 초안을 Claude Code로 자동화해 야근 사무 작업을 줄이는 절차와 프롬프트 템플릿, 검증 스크립트를 실제 예시로 소개합니다.
사진 스튜디오 예약 답장·촬영 플랜 안내·납품 연락을 Claude Code로 줄이기
사진 스튜디오의 예약 답장, 촬영 플랜 안내, 납품 연락을 Claude Code로 초안 자동화. 복붙 프롬프트 템플릿과 검증 스크립트 포함. 접수·작가용.
무료 PDF: Claude Code 치트시트
이메일을 입력하면 명령, 리뷰 습관, 안전한 워크플로를 정리한 PDF를 받을 수 있습니다.
개인정보를 안전하게 관리하며 스팸을 보내지 않습니다.
작성자 소개
Masa
Claude Code 실무 워크플로와 팀 도입을 검증하는 엔지니어입니다.