実現したいこと
・検索条件(ファイル名、メディアタイプ、日付)で対象ファイルを絞り込んで表示
・ファイル名の形式:YYYYMMDD_TYPE_NAME.pdf
発生している問題・分からないこと
- ファイル名での絞り込みが正しく機能していない
- ファイル名で検索しても、全てのファイルが検索対象になってしまう
- 日付での絞り込みが正しく機能していない
- 例:2024/11/05より前の日付で検索しても、2024/11/05のファイルが表示されない
該当のソースコード
Python
1def get_filtered_files(start_date, end_date, media_type, search_file_name): 2 """ 3 ファイル検索機能 4 Parameters: 5 - start_date: 検索開始日 (YYYY-MM-DD) 6 - end_date: 検索終了日 (YYYY-MM-DD) 7 - media_type: メディアタイプ (type_A, type_B, type_C) 8 - search_file_name: 検索対象ファイル名 9 """ 10 try: 11 # メディアタイプのマッピング 12 media_mapping = { 13 'type_A': 'A', 14 'type_B': 'B', 15 'type_C': 'C' 16 } 17 18 expected_media = media_mapping.get(media_type) 19 20 # 検索終了日の変換 21 search_end_date = datetime.strptime(end_date, '%Y-%m-%d').date() 22 23 files_found = [] 24 25 # 特定のファイル名検索の場合 26 if search_file_name and search_file_name.endswith('.pdf'): 27 specified_file = search_file_name 28 29 for filename in os.listdir(DATA_DIR): 30 if not filename.endswith('.pdf'): 31 continue 32 33 # ファイル名のパース (format: YYYYMMDD_TYPE_NAME.pdf) 34 file_parts = filename.split('_') 35 if len(file_parts) != 3: 36 continue 37 38 doc_type = file_parts[0] 39 current_media = file_parts[1] 40 date_part = file_parts[2].replace('.pdf', '') 41 42 # 問題のある部分: ファイル名での検索条件チェック 43 if search_file_name in ["report_A", "report_B"]: 44 if doc_type != search_file_name: 45 continue 46 47 try: 48 file_date = datetime.strptime(date_part, '%Y%m%d').date() 49 except ValueError: 50 continue 51 52 # 問題のある部分: 日付による絞り込み 53 if file_date > search_end_date: 54 continue 55 56 files_found.append({ 57 'name': filename, 58 'type': doc_type, 59 'upload_date': file_date.strftime('%Y-%m-%d') 60 }) 61 62 return { 63 'status': 'success', 64 'files': files_found 65 } 66 67 except Exception as e: 68 return { 69 'status': 'error', 70 'message': 'エラーが発生しました' 71 }
JavaScript
1// 検索フォーム送信処理 2async function handleSubmit(e) { 3 e.preventDefault(); 4 5 const formData = new FormData(e.target); 6 const searchParams = { 7 fileName: formData.get('fileName'), 8 mediaType: formData.get('mediaType'), 9 startDate: formData.get('startDate'), 10 endDate: formData.get('endDate') || formData.get('startDate') 11 }; 12 13 // 必須項目チェック 14 if (!searchParams.fileName || !searchParams.mediaType || !searchParams.startDate) { 15 alert('必須項目を入力してください'); 16 return; 17 } 18 19 // 日付の妥当性チェック 20 const startDateTime = new Date(searchParams.startDate); 21 const endDateTime = new Date(searchParams.endDate); 22 23 if (isNaN(startDateTime.getTime()) || isNaN(endDateTime.getTime())) { 24 alert('日付の形式が不正です'); 25 return; 26 } 27 28 if (startDateTime > endDateTime) { 29 alert('開始日は終了日より前の日付を指定してください'); 30 return; 31 } 32 33 await fetchFilteredData(searchParams); 34} 35 36// サーバーからデータ取得 37async function fetchFilteredData(searchParams) { 38 const queryParams = new URLSearchParams(); 39 40 // 問題のある部分: パラメータの設定 41 if (searchParams.startDate?.trim()) { 42 queryParams.append('uploadedAtStart', searchParams.startDate); 43 } 44 if (searchParams.endDate?.trim()) { 45 queryParams.append('uploadedAtEnd', searchParams.endDate); 46 } 47 if (searchParams.mediaType?.trim()) { 48 queryParams.append('documentType', searchParams.mediaType); 49 } 50 if (searchParams.fileName?.trim()) { 51 queryParams.append('fileName', searchParams.fileName); 52 } 53 54 try { 55 const response = await fetch(`/api/search?${queryParams}`, { 56 method: 'GET', 57 headers: { 58 'Accept': 'application/json' 59 } 60 }); 61 62 if (!response.ok) { 63 throw new Error(`HTTP error! status: ${response.status}`); 64 } 65 66 const data = await response.json(); 67 68 if (data.status === 'warning') { 69 alert(data.message); 70 displayResults([]); 71 } else if (data.status === 'error') { 72 throw new Error(data.message); 73 } else { 74 displayResults(data.files); 75 } 76 77 } catch (error) { 78 console.error('Error fetching data:', error); 79 alert('データの取得に失敗しました'); 80 displayResults([]); 81 } 82} 83 84// 検索結果の表示 85function displayResults(files) { 86 const tableBody = document.querySelector('#resultsTable tbody'); 87 if (!tableBody) return; 88 89 tableBody.innerHTML = ''; 90 91 if (files.length === 0) { 92 const row = document.createElement('tr'); 93 const td = document.createElement('td'); 94 td.colSpan = 8; 95 td.textContent = '該当するファイルが見つかりません'; 96 td.style.textAlign = 'center'; 97 row.appendChild(td); 98 tableBody.appendChild(row); 99 return; 100 } 101 102 // 問題のある部分: ファイル情報の表示 103 files.forEach(file => { 104 const row = document.createElement('tr'); 105 106 // ファイル名から情報を抽出 107 const fileInfo = extractFileInfo(file.name); 108 109 const cells = [ 110 { text: file.name, class: 'file-name' }, 111 { text: file.uploadDate, class: 'upload-date' }, 112 { text: fileInfo?.type || '', class: 'doc-type' }, 113 { text: fileInfo?.media || '', class: 'media-type' } 114 ]; 115 116 cells.forEach(cell => { 117 const td = document.createElement('td'); 118 td.textContent = cell.text; 119 td.classList.add(cell.class); 120 row.appendChild(td); 121 }); 122 123 tableBody.appendChild(row); 124 }); 125} 126 127// ファイル名からパラメータを抽出 128function extractFileInfo(filename) { 129 // 問題のある部分: ファイル名のパース 130 const regex = /^(.+?)_(.+?)_(\d{8})\.pdf$/; 131 const match = filename.match(regex); 132 133 if (!match) return null; 134 135 const [_, docType, media, date] = match; 136 137 return { 138 docType, 139 media, 140 date: `${date.slice(0,4)}-${date.slice(4,6)}-${date.slice(6,8)}` 141 }; 142}
試したこと・調べたこと
- teratailやGoogle等で検索した
- ソースコードを自分なりに変更した
- 知人に聞いた
- その他
上記の詳細・結果
定義の部分を見直しましたが、全てのファイル名が表示される。
補足
特になし
「定義の部分を見直しました」と書いていますが、具体的に定義とは何のことですか?
また、見直したとは具体的にどのように見直したのですか?
あなたの回答
tips
プレビュー