• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Jak zarządzać ścieżką plików znajdujących się na wielu maszynach i przechowywać tą ścieżkę w baze danych?

+2 głosów
60 wizyt
pytanie zadane 8 lipca 2021 w JavaScript przez FoLONG Nowicjusz (160 p.)
Zastanawiam się jak zarządzać plikami które znajdują się na kilku serwerach, mianowicie użytkownik wysyła plik na serwer a load balancer przekierowuje użytkownika na maszynę która jest najmniej obciążona i plik jest zapisywany na tej maszynie. Teraz jak zapisać ścieżkę do pliku w bazie danych tak aby użytkownik zawsze był przekierowany na maszynę która posiada jego plik?

1 odpowiedź

0 głosów
odpowiedź 10 lipca 2021 przez VBService Mędrzec (171,990 p.)
edycja 10 lipca 2021 przez VBService

Propozycja,

Podzieliłbym na kolumny np. tak:

 id   id_user   server_name   file_name   ext   date 
1 u828 fs-001  ad235ser676734  jpg  2021-07-09 
2 u828 fs-003  dd349qwn99991  png  2021-07-10 

 

i później np. w php-ie połączyć te dane w ścieżkę

(nazwa obrazka - ad235ser676734 - wygenerowana w czasie upload-u)

<img src="image.php?uid=u828.ad235ser676734">

np. image.php

<?php
  session_start();

  if (Czy user jest zalogowany np. $_SESSION('logged_user_id')) {
    if (!empty($_GET['uid'])) {
      list($id_user, $file_name) = explode('.', $_GET['uid']);
   
      // sprawdzenie danych
      // np. u 828 - id_user to 1 mała litera i 3 cyfry
      $id_user = (preg_match("/^[a-z][0-9]{3}/", $id_user)) ?  $id_user : null;
      // np. ad 235 ser 676734 - file_name to 2 małe litery, 3 cyfry, 3 małe litery i do końca cyfry nie mniej jak 5 cyfr i więcej
      $file_name = (preg_match("/^[a-z].[0-9]..[a-z]..[0-9]{5,}/", $file_name)) ?  $file_name : null;

      if (($id_user && $file_name) && $_SESSION('logged_user_id') == $id_user) {
        define('PATH_TO_USERS_FILE','users/{{id_user}}/uploaded/');

        // tu połaczenie z bazą danych
        // przykładowy $sql = "SELECT server_name, ext FROM uploaded_users_files WHERE id_user = '$id_user' AND file_name = '$file_name'";
    
        if (SQL zwrócił wartość poprawnie) {
          $server_name = $row['server_name']; // np. 'fs-001';
                  $ext = $row['ext']; // np. 'jpg';
      
          $full_path = "https://xxx.pl/$server_name/"
                     . str_replace('{{id_user}}', $id_user, PATH_TO_USERS_FILE) . "$file_name.$ext";

          $fp = fopen($full_path, 'rb');

          header("Content-Type: image/{$ext}"); 

          fpassthru($fp);
          exit;
        }
      }
    }
  }
?>

można też zostawić samą nazwę obrazka, a id_user pobierać z sesji.

<img src="image.php?uid=ad235ser676734">

i odpowiednio dopasować image.php.

Podobne pytania

+1 głos
1 odpowiedź 142 wizyt
+1 głos
3 odpowiedzi 254 wizyt
pytanie zadane 15 września 2018 w C i C++ przez Piotr Batko Stary wyjadacz (13,190 p.)
–1 głos
1 odpowiedź 68 wizyt
pytanie zadane 15 marca 2016 w JavaScript przez McShadow Obywatel (1,050 p.)

88,328 zapytań

136,921 odpowiedzi

305,575 komentarzy

58,599 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Sklep oferujący ćwiczenia JavaScript, PHP, rozmowy rekrutacyjne dla programistów i inne materiały

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...