Я сделал работу в следующих шагах:
Я написал код для чтения файла MS Word с изображением в нем.
После извлечения пути к файлу из XML-кода я успешно загружаю изображение на свой локальный сервер. Пример XML-файла: — <pic:cnvpr id="0" name="Picture 4" descr="C:\Users\Administrator\Documents\tshirt\14714-yepme-s-275x340-imadpnn23zqpjqzz.jpeg"</pic:cnvpr>
Когда я загружаю файл слова на сервер и загружаю его с сервера на другой компьютер, файл слова содержит изображения, как при запуске.
Но теперь, когда я загружаю файл слова с сервера, файл с тем же путем локального сервера и изображение не загружены.
Мой вопрос: как я могу загрузить изображение файла слова на сервер?
Прочитав описание XML-файла, я просто копирую это изображение вот так
$pattern2 = '/descr="(.*?)"\/>/';
$str = str_replace('\\', '/', $val);
copy($str,$imagepath);
Другими словами, я хочу загрузить файл на сервер с моего компьютера, где у меня есть локальный путь к файлу.
Вот полный код, где я использовал read_file_docx
функция для преобразования docx
подать в xml
с некоторыми разделителями:
if($_FILES["file"]["name"][$value]!='' && ($ext=='docx' || $ext=='doc')){
$rand=time();
$fileName=$scheduleId."_".$value."_".$rand.".doc";
$cvsId=uploadCsvForQuestion($value,$scheduleId,$fileName,$rand);
copy(
$_FILES["file"]["tmp_name"][$value],
"../question_csv/" .$fileName
); // file save in folder
//extract data from doc file
$allData=read_file_docx($_FILES["file"]["tmp_name"][$value],"r");
// explode from question
$rre=explode("^@@@^",$allData);
//print_r($allData);exit;
$pattern2 = '/descr="(.*?)"\/>/';
foreach($rre as $key=>$rrevalue){
if($key!=0){
$remaks=explode("Remarks:",$rrevalue);
$hint=explode("Exp:",$remaks[0]); //explode from hint.
$ans=explode("Ans-",$hint[0]);//explode from ans.
$option=explode("^@@^",$ans[0]);//explode from options with question.
preg_match_all($pattern2, $hint[1], $hintmatches);
// All images in hint will save in array then save in field
if(is_array($hintmatches)){
foreach($hintmatches[1] as $key=>$val){
$str = str_replace('\\', '/', $val);
if(file_exists( $str)){
$imag1=rand().basename($str);
$sestination="../question_image/";
copy($str,$sestination."".$imag1);
$images_hint[]=$imag1;
}
}
if(is_array($images_hint)){
$imagesHint=implode("||",$images_hint);
$images_hint='';
}
}
foreach ($option as $keys=>$valuew) {
preg_match_all($pattern2, $valuew, $matches2);
// All images in that section like question and option will save in array then save in field
if(is_array($matches2[1])){
foreach($matches2[1] as $key=>$val){
$str = str_replace('\\', '/', $val);
if(file_exists($str)){
$imag2=rand().basename($str);
$sestination="../question_image/";
copy($str,$sestination."".$imag2);
$imagesArray[]=$imag2;
}
}
if(is_array($imagesArray)){
$imag=implode("||",$imagesArray);
$imagesArray='';
}
}
$valuew = strip_tags($valuew,"<sub><sup>");
if($keys==0){
//$str11= substr($valuew,'2'); old one
$newQuesion=explode(".",$valuew);
//
$num=0;
if($newQuesion!=''){
$hint = strip_tags($hint[1],"<sub><sup>");
$quesionId=uploadQuestion($cvsId,$value,$scheduleId,addslashes($newQuesion[1]),$hint,$imag,$imagesHint,$imagesHint,$remaks[1]);//save question
$imagesHint='';
}
}else{
uploadOption($quesionId,addslashes($valuew),$keys,$imag);//save option
}
$num++; $imag="";
}
if($ans[1]!=''){
uploadAnswer($quesionId,$ans[1]);//save answer
}
}
}
}function read_file_docx($filename){
$striped_content = '';
$content = '';
if(!$filename || !file_exists($filename))
return false;
$zip = zip_open($filename);
if (!$zip || is_numeric($zip))
return false;
while ($zip_entry = zip_read($zip)) {
if (zip_entry_open($zip, $zip_entry) == FALSE) continue;
if (zip_entry_name($zip_entry) != "word/document.xml") continue;
$content .= zip_entry_read($zip_entry, zip_entry_filesize($zip_entry));
zip_entry_close($zip_entry);
}
file_put_contents('question.xml', $content);
$content2 = explode('<w:vertAlign w:val="subscript"/></w:rPr><w:t>', $content);
$pattern = "/<w:vertAlign w:val=\"subscript\"\/><\/w:rPr><w:t>(.*?)<\/w:t><\/w:r>/";
preg_match_all($pattern, $content, $matches);
$var=array_map("strip_tags_sub",$matches[1]);
foreach($content2 as $key=>$value)
{
if($key!=0){
$var1=strip_tags($var[$key]);
$content=str_replace('<w:vertAlign w:val="subscript"/></w:rPr><w:t>'.$var1."</w:t></w:r>", $var[$key],$content);
}
}
$content1 = explode('<w:vertAlign w:val="superscript"/></w:rPr><w:t>', $content);
$pattern = "/<w:vertAlign w:val=\"superscript\"\/><\/w:rPr><w:t>(.*?)<\/w:t><\/w:r>/";
preg_match_all($pattern, $content, $matchesa);
$var1=array_map("strip_tags_sup",$matchesa[1]);
foreach($content1 as $key=>$value)
{
if($key!=0){
$varq=strip_tags($var1[$key]);
$content=str_replace('<w:vertAlign w:val="superscript"/></w:rPr><w:t>'.$varq."</w:t></w:r>", $var1[$key],$content);
}
}
$content = str_replace('</w:r></w:p>', " ", $content);
$content = str_replace('</w:r></w:p></w:tc><w:tc>', " ", $content);
$allData = strip_tags($content,'<pic:cNvPr><sub><sup>');
$allData = str_replace('(Q', "^@@@^", $allData);//saperate from question
$allData = str_replace('1).', "^@@^", $allData);//saperate from option
$allData = str_replace('2).', "^@@^", $allData);//saperate from option
$allData = str_replace('3).', "^@@^", $allData);//saperate from option
$allData = str_replace('4).', "^@@^", $allData);//saperate from option
$allData = str_replace('5).', "^@@^", $allData);//saperate from option
$allData = str_replace('6).', "^@@^", $allData);//saperate from option
return $allData ;
}
Измените ваше изображение в двоичных данных из пути localhost и после этого получите изображение из двоичных данных на сервере.
Проблема здесь в том, что вы пытаетесь скопировать () файл с путем на клиенте, но функция copy () запускается на сервере.
Поскольку файл не существует на сервере, вы не сможете его скопировать. Он работал на localhost, потому что клиент и сервер были просто одной и той же файловой системой.
Вы можете реализовать это с помощью клиентского кода, такого как Javascript, в котором вы отправите форму загрузки с локальным извлеченным путем к файлу, а PHP-код на стороне сервера обработает загруженное изображение.