Avatar billede kirsten Nybegynder
25. februar 2010 - 16:07 Der er 20 kommentarer og
1 løsning

Upload af docx

Hej,
sidder med en upload script til word dokumenter.
Dokumenterne bliver smidt et blob felt i min database.
Problemet opstår ved .docx filer der skal hentes igen fra databasen. Word påstår hvergang at filen er korrupt (Filen kan dog godt åbnes)
Problemet er der ikke ved .doc filer....

Er der nogen der ved om man skal være opmærksom på noget bestemt ved upload af .docx filer ??
Avatar billede majbom Novice
25. februar 2010 - 17:47 #1
vil du have dem gemt i en database? du kan ikke gemme dem som alm. filer?
Avatar billede kirsten Nybegynder
25. februar 2010 - 18:00 #2
De bliver allerede gemt i database..
Problemet er der kun med docx filer....
Avatar billede kirsten Nybegynder
25. februar 2010 - 18:05 #3
Glemte lige at tilføje at jeg har testet med upload uden om databasen og der opstår fejlen også med korupte docx filer...
Avatar billede majbom Novice
25. februar 2010 - 18:09 #4
hvordan ser dit upload-script ud?
Avatar billede intenz Novice
25. februar 2010 - 18:19 #5
Du er sikker på, at din upload fil og dit database felt har samme encoding?
Avatar billede acore Ekspert
25. februar 2010 - 18:33 #6
BLOB felter har - så vidt jeg ved - ingen encoding
Avatar billede kirsten Nybegynder
25. februar 2010 - 18:38 #7
Ja databasen er sat standard til ISO-8859-1.
Det er alle sider også.
Men i mener altså ikke der er noget specielt ved docx filer i forbindelse med upload ?
Avatar billede intenz Novice
25. februar 2010 - 19:02 #8
#6 kan sagtens være. Det er ikke noget jeg bruger særligt tit, så jeg ved det ikke.

#7
Nej, upload af en fil bør ikke kunne ødelægge formatet, med mindre du selv laver rav i den. Upload er at sammenligne med en 1:1 kopiering på harddisken, det foregår bare over nettet.
Er dine filer eller den harddisk hvor filerne ligger på krypteret, kan svaret dog være et andet.
Avatar billede kirsten Nybegynder
25. februar 2010 - 23:29 #9
Jeg har testet fra forskellige maskiner og resultatet er det samme hvergang det er docx..
Jeg har kigget min kode igennem, men syntes ikke jeg kan se noget specielt der kunne være grunden til at docx filer brokker sig...
Syntes det er pænt mystisk...
Der er jo ingen problemer med feks doc filer...

Her er et uddrag af koden:

if (isset($_POST['leaseContractSubmit'])) {
        $errors = 0;
        $uploadError = "";

        $file = $_FILES['leaseContract'];

        if (empty($file['name'])) {
            $uploadError .= "<p>INGEN FIL VALGT TIL UPLOAD</p>";
            $errors++;
        }

        $allowedExtensions = array("docx", "doc", "txt");

        function isAllowedExtension($fileName)
        {

            global $allowedExtensions;

            return in_array(end(explode(".", strtolower($fileName))), $allowedExtensions);

        }

        if (!isAllowedExtension($file['name'])) {

            $uploadError .= "<p>IKKE TILLADT FILTYPE</p>";
            $errors++;

        }

        if ($file['size'] == 0) {
            $uploadError .= "<p>INGEN FIL UPLOADET</p>";
            $errors++;
        }

        $smarty->assign('errors', $uploadError);

        if ($errors == 0) {
            $uploaddir = BASEPATH . '/invoices/';
            $uploadfile = $uploaddir . basename($file['name']);

            if (!move_uploaded_file($file['tmp_name'], $uploadfile)) {

                echo "DER OPSTOD EN FEJL VED UPLOAD!!";
                break;
            }

            if (file_exists($uploadfile)) {

                $leaseFile = fopen($uploadfile, 'r+');

                $leaseContract->setLeaseContractFile($leaseFile);

                $leaseContract->setLeaseContractFileName($file['name']);

                $leaseContract->setUpdateUserID($_SESSION['userObject']->getUserID());

                $leaseContract->setUpdateDate(date("Y-m-d H:i:s"));

                $leaseContractDB->updateUserLeaseContract($leaseContract);

                //unlink($uploadfile);

            } else {

                echo "DER OPSTOD EN FEJL VED UPLOAD!!";
                break;
            }
Avatar billede coderdk Praktikant
25. februar 2010 - 23:35 #10
Vi skal nok se noget kode - Downloader du gennem et script?
Avatar billede coderdk Praktikant
25. februar 2010 - 23:36 #11
Jeg skal lære at reloade ;) Mit gæt er, at der bliver skrevet noget ud i dit download script der henter fra DB - tror et mellemrum er nok til at få den til at ørle.
Avatar billede kirsten Nybegynder
26. februar 2010 - 00:11 #12
hehe ;)
Ja det er også den konklusion jeg er kommet frem til..
Mit download script ser sådan her ud :

if (isset($_GET['metode']) && $_GET['metode'] == "visLejekontrakt" && isset($_GET['kontraktID']) &&
    $_GET['kontraktID'] != "" && isset($_GET['brugerID']) && $_GET['brugerID'] != "") {
    $leaseContract = $leaseContractDB->getUserLeaseContract($_GET['brugerID'], $_GET['kontraktID']);

    if (isset($leaseContract) && is_object($leaseContract)) {

        header('Content-type: application/msword');
        header('Content-Disposition: attachment; filename="' . $leaseContract->
            getLeaseContractFileName() . '"');

        echo $leaseContract->getLeaseContractFile();

    }
}

Men syntes ikke lige jeg kan se hvor der kan komme mellemrum pånær i filnavnet..
Det er måske nok ??
Tror jeg lige tester med et filnavn uden mellemrum..
Avatar billede kirsten Nybegynder
26. februar 2010 - 00:13 #13
Ingen forskel med filnavnet....
Avatar billede coderdk Praktikant
26. februar 2010 - 00:16 #14
Er der et mellemrum eller linjeskift i slutningen af downloadscriptet, e.g.

?>
(noget her - usynligt?)
Avatar billede kirsten Nybegynder
26. februar 2010 - 00:38 #15
Kan ikke finde nogen mellemrum.
Men jeg har konstateret at det ER i mit download script at fejlen ligger.
Ved fil upload til serveren er der ingen fejl i dokumentet...
Jeg kigger videre imorgen.
Tak for hjælpen :)
Avatar billede coderdk Praktikant
26. februar 2010 - 00:43 #16
Aaaah! Prøv at lave

header('Content-type: application/msword');

om til:

header('Content-type: application/vnd.openxmlformats-officedocument.wordprocessingml.document');

eller blot:

header('Content-type: application/octet-stream');
Avatar billede kirsten Nybegynder
26. februar 2010 - 00:50 #17
Det gør ingen forskel.. :(
Avatar billede coderdk Praktikant
26. februar 2010 - 00:59 #18
Hmm underligt. Det skal i hvert fald ikke være application/msword - så lad den være application/octet-stream...

Prøv også at smide

header("Content-Transfer-Encoding: binary");

og

header("Expires: 0");

ind bare for en sikkerheds skyld
Avatar billede kirsten Nybegynder
26. februar 2010 - 11:53 #19
Det er testet med de 2 headers, problemet er det samme..
Jeg er lige ved at ændre valideringen så den kun tager doc filer ;)
Avatar billede kirsten Nybegynder
24. marts 2010 - 13:33 #20
Jeg lukker igen..
Fandt ikke problemet...
Avatar billede kirsten Nybegynder
24. marts 2010 - 13:33 #21
Svar..
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester