2016-12-02 67 views
0

我的PHP程序使用多部分请求的内容生成PDF,但生成的PDF的一些已损坏,无法修复,我不知道为什么?如何检查PDF是否被PHP损坏?

我的要求:

var fromData = new FormData(); 
fromData.append('first_name', last_name); 
fromData.append('last_name', first_name); 
fromData.append('file', blobFile); 
$.ajax({ 
    url : url_serveur + 'archiver.php', 
    type : 'POST', 
    data : fromData, 
    processData: false, 
    dataType : 'json', 
    contentType: 'multipart/form-data', 
    success : function(code_html, statut){ 
     if (code_html.status == 1) { 
      // delete PDF 
     } else { 
      // try for second time 
     } 
    }, 
    error : function(resultat, statut, erreur){ 
     // try for second time 
    }, 
}); 

我的PHP程序:

<?php 

function readFromContent($raw_data) { 
    $CONTENT = array(); 
    // Fetch content and determine boundary 
    $boundary = substr($raw_data, 0, strpos($raw_data, "\r\n")); 

    // Fetch each part 
    $parts = array_slice(explode($boundary, $raw_data), 1); 
    $data = array(); 

    foreach ($parts as $part) { 
     // If this is the last part, break 
     if ($part == "--\r\n") break; 

     // Separate content from headers 
     $part = ltrim($part, "\r\n"); 
     list($raw_headers, $body) = explode("\r\n\r\n", $part, 2); 

     // Parse the headers list 
     $raw_headers = explode("\r\n", $raw_headers); 
     $headers = array(); 
     foreach ($raw_headers as $header) { 
      list($name, $value) = explode(':', $header); 
      $headers[strtolower($name)] = ltrim($value, ' '); 
     } 

     // Parse the Content-Disposition to get the field name, etc. 
     if (isset($headers['content-disposition'])) { 
      $filename = null; 
      preg_match(
      '/^(.+); *name="([^"]+)"(; *filename="([^"]+)")?/', 
      $headers['content-disposition'], 
      $matches 
      ); 
      list(, $type, $name) = $matches; 
      isset($matches[4]) and $filename = $matches[4]; 

      // handle your fields here 
      switch ($name) { 
       // this is a file upload 
       case 'userfile': 
        file_put_contents($filename, $body); 
       break; 

       // default for all other files is to populate $data 
       default: 
        $data[$name] = substr($body, 0, strlen($body) - 2); 
        $CONTENT[$name] = $data[$name]; 
       break; 
      } 
     } 
    } 

    return $CONTENT; 
} 

$raw_data = file_get_contents('php://input'); 
$CONTENT = readFromContent($raw_data); 

$file = $CONTENT["file"]; 
$first_name = htmlentities($CONTENT["first_name"]); 
$last_name = htmlentities($CONTENT["last_name"]); 
$chemin = "/var/www/files/"; 
$filename = $first_name.'_'.$last_name.'.pdf'; 

if(file_exists($chemin)){ 
    $contrat = file_put_contents($chemin.$filename, $file); 
    $filePath = $chemin.$filename; 

    if(file_exists($chemin.$filename)){ 
     // check if file (PDF) generated is damaged 
     $message= array ('status'=> 1); 
     echo json_encode($message); die(); 
    } 
} 
$message= array ('status'=> 0); 
echo json_encode($message); die(); 

如何我可以检查文件(PDF)中产生损坏?

+0

要检查有物品损坏时,应描述物品损坏时的标准。你有这样的标准吗? –

+0

有很多可能的方式来搞乱PDF。最有可能的是,外部参照表是不正确的。您可能会注意到PDF Validator(例如,PDF-Tools AG有一个),您可以将其用于工作流程。 –

+0

在APK文件没有损坏我认为我应该使用大小作为标准,但我搜索如何获得Adobe Acroba返回的消息,当我尝试打开文件?或者我如何检查多部分请求中是否有任何损失? –

回答

0

我用的校验系统,它似乎正常工作。

通过:

  • 散列PDF文件中的请求
  • 执行之前发送的哈希结果作为参数在请求
  • 再次散列当收据用PHP PROGRAMM文件
  • 2个哈希结果之间的比较,如果相似的PDF不被损坏,否则PDF损坏