uploadFile
This commit is contained in:
		
							parent
							
								
									1d10bfca2c
								
							
						
					
					
						commit
						daa468c535
					
				@ -21,8 +21,13 @@ interface UploadResult {
 | 
			
		||||
const UPLOAD_CONFIG = {
 | 
			
		||||
  maxFileSize: 50 * 1024 * 1024, // 50MB
 | 
			
		||||
  allowedTypes: new Set([
 | 
			
		||||
    // Images
 | 
			
		||||
    'image/jpeg', 'image/jpg', 'image/png', 'image/gif', 'image/webp', 'image/svg+xml',
 | 
			
		||||
    
 | 
			
		||||
    // Videos
 | 
			
		||||
    'video/mp4', 'video/webm', 'video/ogg', 'video/avi', 'video/mov',
 | 
			
		||||
    
 | 
			
		||||
    // Documents
 | 
			
		||||
    'application/pdf',
 | 
			
		||||
    'application/msword',
 | 
			
		||||
    'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
 | 
			
		||||
@ -30,7 +35,32 @@ const UPLOAD_CONFIG = {
 | 
			
		||||
    'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
 | 
			
		||||
    'application/vnd.ms-powerpoint',
 | 
			
		||||
    'application/vnd.openxmlformats-officedocument.presentationml.presentation',
 | 
			
		||||
    'text/plain', 'text/csv', 'application/json'
 | 
			
		||||
    
 | 
			
		||||
    // Text files
 | 
			
		||||
    'text/plain', 
 | 
			
		||||
    'text/csv', 
 | 
			
		||||
    'text/markdown',           // Added markdown
 | 
			
		||||
    'text/x-markdown',         // Alternative markdown MIME type
 | 
			
		||||
    'application/json',
 | 
			
		||||
    'application/xml',
 | 
			
		||||
    'text/xml',
 | 
			
		||||
    'text/html',
 | 
			
		||||
    
 | 
			
		||||
    // Archives
 | 
			
		||||
    'application/zip', 
 | 
			
		||||
    'application/x-tar', 
 | 
			
		||||
    'application/gzip',
 | 
			
		||||
    'application/x-gzip',
 | 
			
		||||
    'application/x-zip-compressed',
 | 
			
		||||
    'application/x-rar-compressed',
 | 
			
		||||
    'application/x-7z-compressed',
 | 
			
		||||
    
 | 
			
		||||
    // Additional useful formats
 | 
			
		||||
    'application/rtf',         // Rich Text Format
 | 
			
		||||
    'text/richtext',
 | 
			
		||||
    'application/x-yaml',      // YAML files
 | 
			
		||||
    'text/yaml',
 | 
			
		||||
    'application/yaml'
 | 
			
		||||
  ]),
 | 
			
		||||
  localUploadPath: process.env.LOCAL_UPLOAD_PATH || './public/uploads',
 | 
			
		||||
  publicBaseUrl: process.env.PUBLIC_BASE_URL || 'http://localhost:4321'
 | 
			
		||||
 | 
			
		||||
@ -114,8 +114,13 @@ const sortedTools = data.tools.sort((a: any, b: any) => a.name.localeCompare(b.n
 | 
			
		||||
          <div class="form-group">
 | 
			
		||||
            <label class="form-label">Dokumente, Bilder, Videos (Optional)</label>
 | 
			
		||||
            <div class="upload-area" id="upload-area">
 | 
			
		||||
              <input type="file" id="file-input" multiple accept=".pdf,.doc,.docx,.txt,.md,.zip,.png,.jpg,.jpeg,.gif,.mp4,.webm" class="hidden">
 | 
			
		||||
              <div class="upload-placeholder">
 | 
			
		||||
              <input 
 | 
			
		||||
                type="file" 
 | 
			
		||||
                id="file-input" 
 | 
			
		||||
                multiple 
 | 
			
		||||
                accept=".pdf,.doc,.docx,.txt,.md,.markdown,.csv,.json,.xml,.html,.rtf,.yaml,.yml,.zip,.tar,.gz,.rar,.7z,.png,.jpg,.jpeg,.gif,.webp,.svg,.mp4,.webm,.mov,.avi" 
 | 
			
		||||
                class="hidden"
 | 
			
		||||
              >              <div class="upload-placeholder">
 | 
			
		||||
                <svg width="48" height="48" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1">
 | 
			
		||||
                  <path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"/>
 | 
			
		||||
                  <polyline points="7 10 12 15 17 10"/>
 | 
			
		||||
@ -342,37 +347,49 @@ class KnowledgebaseForm {
 | 
			
		||||
      console.log('[UPLOAD] Response status:', response.status);
 | 
			
		||||
      console.log('[UPLOAD] Response headers:', Object.fromEntries(response.headers.entries()));
 | 
			
		||||
 | 
			
		||||
      // FIXED: Read the response body only once
 | 
			
		||||
      let responseData: any;
 | 
			
		||||
      let responseText: string;
 | 
			
		||||
      
 | 
			
		||||
      try {
 | 
			
		||||
        // Try to read as text first (works for both JSON and plain text)
 | 
			
		||||
        responseText = await response.text();
 | 
			
		||||
        console.log('[UPLOAD] Raw response:', responseText.substring(0, 200));
 | 
			
		||||
        
 | 
			
		||||
        // Then try to parse as JSON
 | 
			
		||||
        try {
 | 
			
		||||
          responseData = JSON.parse(responseText);
 | 
			
		||||
        } catch (parseError) {
 | 
			
		||||
          // If JSON parsing fails, treat as plain text
 | 
			
		||||
          responseData = { error: responseText };
 | 
			
		||||
        }
 | 
			
		||||
      } catch (readError) {
 | 
			
		||||
        console.error('[UPLOAD] Failed to read response:', readError);
 | 
			
		||||
        throw new Error('Failed to read server response');
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      if (response.ok) {
 | 
			
		||||
        const result = await response.json();
 | 
			
		||||
        console.log('[UPLOAD] Success result:', result);
 | 
			
		||||
        console.log('[UPLOAD] Success result:', responseData);
 | 
			
		||||
        
 | 
			
		||||
        fileItem.uploaded = true;
 | 
			
		||||
        fileItem.url = result.url;
 | 
			
		||||
        fileItem.url = responseData.url;
 | 
			
		||||
        this.renderFileList();
 | 
			
		||||
        
 | 
			
		||||
        this.showMessage('success', `Successfully uploaded ${fileItem.name}`);
 | 
			
		||||
      } else {
 | 
			
		||||
        // Enhanced error handling - read the actual error from response
 | 
			
		||||
        // Enhanced error handling with single response read
 | 
			
		||||
        let errorMessage = `Upload failed with status ${response.status}`;
 | 
			
		||||
        
 | 
			
		||||
        try {
 | 
			
		||||
          const errorData = await response.json();
 | 
			
		||||
          console.error('[UPLOAD] Error response data:', errorData);
 | 
			
		||||
          
 | 
			
		||||
          if (errorData.error) {
 | 
			
		||||
            errorMessage = errorData.error;
 | 
			
		||||
        if (responseData && responseData.error) {
 | 
			
		||||
          errorMessage = responseData.error;
 | 
			
		||||
        } else if (responseText) {
 | 
			
		||||
          errorMessage += ` (${responseText.substring(0, 100)})`;
 | 
			
		||||
        }
 | 
			
		||||
        
 | 
			
		||||
        // Log additional details if available
 | 
			
		||||
          if (errorData.details) {
 | 
			
		||||
            console.error('[UPLOAD] Error details:', errorData.details);
 | 
			
		||||
            errorMessage += ` (Details: ${errorData.details.join(', ')})`;
 | 
			
		||||
          }
 | 
			
		||||
        } catch (parseError) {
 | 
			
		||||
          console.error('[UPLOAD] Could not parse error response:', parseError);
 | 
			
		||||
          const errorText = await response.text();
 | 
			
		||||
          console.error('[UPLOAD] Raw error response:', errorText);
 | 
			
		||||
          errorMessage += ` (Raw: ${errorText.substring(0, 100)})`;
 | 
			
		||||
        if (responseData && responseData.details) {
 | 
			
		||||
          console.error('[UPLOAD] Error details:', responseData.details);
 | 
			
		||||
          errorMessage += ` (Details: ${responseData.details.join(', ')})`;
 | 
			
		||||
        }
 | 
			
		||||
        
 | 
			
		||||
        throw new Error(errorMessage);
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user