Baltic Finance Uploadformular
Web Development
Tech: HTML, CSS, JS, PHP
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
- 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);
}