Projects

Baltic Finance Uploadformular

Web Development

Tech: HTML, CSS, JS, PHP

Baltic Finance Uploadformular

Jeg havde muligheden at udvikle en uploadformular for balticfinance, som skulle kunne håndtere upload af filer og sende dem videre til balticfinance.

Jeg fik fra virksomheden opstillet nogle krav som formularet skulle kunne. Kravne var:

  • Upload af filer
  • Skulle kunne validere skadenummer i rigtige format
  • Skulle kunne validere om filerne var i rigtige format (*.jpg, *.jpeg, *.png, *.pdf, *.gif, *.zip, *.webp)
  • Uploaded skulle først ske når skadenummeret er i rigtig format
  • Send filerne videre til balticfinance
  • Send en bekræftelse til brugeren
  • Upload en kopi til nextcloud

Formularen

Formularen blev udviklet i PHP og HTML, hvor jeg benyttede mig af PHP til at validere og håndtere upload af filer. I projekt beskrivelsen fik jeg udover kravne også et design som jeg tog udgangspunktet i.

Jeg fik started med at bygge selve formularet i HTML & CSS, da det var noget der tog kortest tid for mig at bygge. Derefter bygyndte jeg på selve upload funktionalitet.

Upload funktion

Upload funktionen blev udviklet i PHP, hvor jeg benyttede mig af PHP´s indbygget funktioner til at håndtere upload af filer. PHP´s indbygget funktioner er:

  • move_uploaded_file()
  • $_FILES
  • $_POST

Der blev implementeret nogle checks for at være sikker på at være sikker på at filerne og brugeren som uploader dokumenterne, er en kunde af balticfinance.

<?php
    // Check om requesten kom fra en POST request og formularet
    if(!isset($_POST["verify_key"]) || !isset($_SESSION["verify_key"]) || $_SESSION["verify_key"] != $_POST["verify_key"]){
        header("HTTP/1.1 401 Verificerings kode stemmer ikke overens!
Session: ".$_SESSION["verify_key"]."
Verify: ".$_POST["verify_key"]); die(); } // Check om Password matcher if(!in_array($_POST["password"], $_ENV["PASSWORD"])){ header("HTTP/1.1 401 Forkert kodeord! ".$_POST["password"]); die(); } for($i=0;$i 15000000){ header("HTTP/1.1 403 En eller flere filer er for stort. Maks 15MB"); } } if(empty($errors)){ $folder_name = date("dmY", time()) . "_" . date("H:i", time()) . "_" . $calim_no . "/"; if (!file_exists($folder_name) && $allowed) { mkdir($folder_name, 0777, true); $json_array = array ( "claim_no" => $calim_no, "file" => $_FILES['file']['name'], "name" => $_POST["name"], "email" => $_POST["email"], "phone" => $_POST["phone"], "who_are_you" => $_POST["who_are_you"], "message" => $_POST["message"] ); $json = json_encode($json_array); file_put_contents($folder_name . "/details.json", $json);

Der laves en details.json fil i en mappe med et case nummer, dato, og tid som indholder

  • Navn
  • Email
  • Case Nummer
  • Telefon nummer
  • Meddelse
  • Indsender
    if(empty($errors)){
        $folder_name = date("dmY", time()) . "_" . date("H:i", time()) . "_" . $calim_no . "/";
        if (!file_exists($folder_name) && $allowed) {
            mkdir($folder_name, 0777, true);

            $json_array = array (
                "claim_no" => $calim_no,
                "file" => $_FILES['file']['name'],
                "name" => $_POST["name"],
                "email" => $_POST["email"],
                "phone" => $_POST["phone"],
                "who_are_you" => $_POST["who_are_you"],
                "message" => $_POST["message"]
            );

            $json = json_encode($json_array);
            file_put_contents($folder_name . "/details.json", $json);

            echo count($_FILES['file']['name']);
            echo $_FILES['file']['name'];

            for($i=0;$i$lt;count($_FILES['file']['name']);$i++) {
                echo "hej";
                $file_name = $_FILES['file']['name'][$i];
                $file_size =$_FILES['file']['size'][$i];
                $file_tmp =$_FILES['file']['tmp_name'][$i];
                $file_type=$_FILES['file']['type'][$i];   
                $movedFiles = move_uploaded_file($file_tmp,$folder_name.$file_name);
            }
        }else{
            $errors[] = "Something went wrong with creating the folder: " . $folder_name;
        }
    }else{
        echo "Hej";
        print_r($errors);
    }

Disse informationer bliver sammentidligt også sendt til nextcloud som et backup. For at kunne sende og uploade alt til nextcloud benytter jeg mig af cURL.

if($movedFiles){
    $ch = curl_init($webDAVurl . '/' . $folder_name);
    curl_setopt($ch, CURLOPT_USERPWD, $webDAVuser . ':' . $webDAVpassword);
    curl_setopt($ch,CURLOPT_HTTPHEADER, array('Authorization: Basic '. base64_encode($webDAVuser . ':' . $webDAVpassword)));
    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'MKCOL');
    curl_exec($ch);
    
    $dir = scandir($folder_name);
    foreach($dir as $file){
        if(is_file($folder_name.$file)){

            $file_path = $folder_name . $file;
            $url = $webDAVurl . $folder_name . str_replace(" ", "-", $file);
            $username = $webDAVuser;
            $password = $webDAVpassword;

            $ch = curl_init();
            curl_setopt($ch, CURLOPT_URL, $url);
            curl_setopt($ch, CURLOPT_USERPWD, $webDAVuser . ':' . $webDAVpassword);
            curl_setopt($ch,CURLOPT_HTTPHEADER, array('Authorization: Basic '. base64_encode($webDAVuser . ':' . $webDAVpassword)));
            curl_setopt($ch, CURLOPT_UPLOAD, true);
            curl_setopt($ch, CURLOPT_PUT, true);
            curl_setopt($ch, CURLOPT_INFILE, fopen($file_path, 'rb'));
            curl_setopt($ch, CURLOPT_INFILESIZE, filesize($file_path));
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
            curl_setopt($ch,CURLOPT_POSTFIELDS,$data);
            $response = curl_exec($ch);
            
            if (curl_errno($ch)) {
                curl_setopt($curl, CURLOPT_VERBOSE, true);
                curl_setopt($curl, CURLOPT_STDERR, fopen('php://stderr', 'w'));
                header("HTTP/1.1 401 Something went wrong with uploading your files.");
            }

            curl_close($ch);
        }