2016-06-22 4 views
0

私は、MySQLデータベース内に直接ファイルを格納するプロジェクトを進めています。このコードは、テキストファイル、画像、PDFを完全に保存してダウンロードしていますが、Excelのスプレッドシートを使用すると問題があります。ファイルの内容をデータベースに直接インポートする - 修復が必要なExcelスプレッドシート

私はExcelのスプレッド(の.xlsx)ファイルを保存している場合、アップロードが正常に動作しますが、私は、ファイルをダウンロードする際、ダウンロードが正常に動作するようですが、私はスプレッドシートを開いたとき、私は、次を得る:

Excel completed file level validation and repair. Some parts of this workbook may have been repaired or discarded.

がこれを行う場合は、Excelの負荷までの罰金とすべてがOKに見えますが、なぜ私が希望:We found a problem with some content in 'filename.xlsx'. Do you want us to try to recover as much as we can? If you trust the source of this workbench, click Yes?'

私はYesを押すと、私は次の取得しますこのエラーが発生していて、なぜ修復する必要があるのでしょうか。

私は、次を使用してファイルを格納しています:

private function writeFileToDatabase($fileName, $tmpName, $type, $fileSize, $fileArea, &$error) 
     { 
      $fileName = mysqli_escape_string($this->conn, $fileName); 
      $fileSize = mysqli_escape_string($this->conn, $fileSize); 
      $type = mysqli_escape_string($this->conn, $type); 
      $fileArea = mysqli_escape_string($this->conn, $fileArea); 

      //Open the uploaded file 
      $fh = fopen($tmpName, 'r'); 
      if (!$fh) 
      { 
       $error = "Could not open uploaded file"; 
       return false; 
      } 
      $content = fread($fh, filesize($tmpName)); 
      $content = mysqli_escape_string($this->conn, $content); 
      fclose($fh); 

      //Store the file in the database 
      $query = "INSERT INTO file_store (RecordID, Area, FileName, ContentType, Size, FileContent) " 
       . "VALUES ('$this->recordID', '$fileArea', '$fileName', '$type', '$fileSize', '$content')"; 
      $result = $this->conn->query($query); 
} 

私は、次を使用してファイルをダウンロードしてください:あなたが提供することができます任意の助け

function downloadFile($fileID) 
     { 
      $fileID = mysqli_escape_string($this->conn, $fileID); 

      $query = "SELECT * FROM file_store WHERE id='$fileID'"; 
      $result = $this->conn->query($query); 
      if ($result) 
      { 
       $data = $result->fetch_array(); 
       header("Content-length: " . $data["Size"]); 
       header("Content-type: " . $data["ContentType"]); 
       header("Content-Disposition: attachment; filename=" . $data["FileName"]); 
       echo $data["FileContent"]; 
      } 
      else 
      { 
       echo mysqli_error($this->conn); 
      } 
     } 

感謝を。

+0

両方のExcelファイルをテキストエディタで開いてアップロードしてダウンロードした場合、ファイル内には異なるものが表示されますか?これは典型的には、最初や最後に何かがあり、空白のように単純なものになります。また、どのようにデータベースにファイルを格納していますか(データ型はBLOBのようなバイナリでなければなりません)?そして、あなたの質問を準備/バインドしようとしましたか?潜在的な余分な文字が追加されるのを助けるかもしれません。さらに、エスケープする必要はなく、より安全です。 –

答えて

1

echo $data["FileContent"]; 

てみてください、この追加後:

ob_clean(); 
flush(); 

それはまだ動作しない場合 - 多分コンテンツタイプのトラップを試してみて、それがない場合は、テキストファイルを別のヘッダーを追加します。

header('Content-Transfer-Encoding: binary'); 
+1

それと同じように、ob_clean()とflush()を修正するだけで済みました。助けてくれてありがとう – Boardy

+0

@Boardyそれをキャプチャしてファイルに書き込んで、問題の内容を確認して修正することもできます。以前に出力されていた空白のようなものがあります。 –

+0

ニース - これはphpや多くのコンテンツのエコーによくある問題です。 – dbmitch

関連する問題