使用laravel8, AJAX 和PhpWord库下载带有costum名称的Word文档

u3r8eeie  于 2022-12-14  发布在  PHP
关注(0)|答案(1)|浏览(114)

我试图使用Laravel8和 AJAX 调用从存储路径下载Word文档。
下面的代码是:

<script>
  $(document).on('click', '.download', function(){

       var data = '';
       var id = $(this).attr('id');
       console.log(id);
       var data = '';
          
       $.ajax({
          
             url:"modeles_contrat/"+id+"/download",
          
             type:"GET",
             data: data, 

             xhrFields: { 
                 responseType: 'blob' 
             }, 
 
             success: function(response) {  
                var blob = new Blob([response]); 
                var link = document.createElement('a'); 
                link.href = window.URL.createObjectURL(blob); 
                link.download = "casting.docx"; 
                link.click(); 
             }, 

             error: function() {
                $('#responseMsg').removeClass("alert-success");
                $('#responseMsg').addClass("alert-danger");
                $('#responseMsg').html('Veuillez générer le contrat');
                $('#responseMsg').show();
             }
            })
           });
</script>

和以下控制器:

public function download($id, $downloadName = null) {
     $data2 = array();
              
     $data_modele = Model_Contrat::where('id_modele_contrat',$id)->first();

     $filename= $data_modele->fichier;
     $filepath = 'Casting_V0.1_Test\casting\storage\app\public\uploads\modeles_contrat/'.$filename;

     /*  $filepath = str_replace('', '/',public_path('Model/'.$filename.'.docx'));
*/

     if (file_exists($filepath)) {
         $headers = array(
                  'Content-Type: application/docx',
         );

         $downloadName = $downloadName??$filename;
         return Response::download($filepath);
     } else {
         $data2['success'] = 2;
         $data2['message'] = 'File not uploaded.'; 
                       
         return response()->json($data2);
     }
}

所有的作品文件,但问题是所有的文件下载的名称casting.docx。我想下载每个文件与其原始名称,而不是与名称casting.docx
如果你有任何想法,我可以下载文件与自定义名称帮助我。
先谢谢你了

编辑

我试图删除 AJAX 调用,所以我使用下面的代码:
在我的数据表中,我添加了一个列链接来获取行的id:

$button .='<a href="/modeles_contrat/"'.$data->id_modele_contrat.'"/download" class="btn btn-xs btn-info pull-right" data_id="'.$data->id_modele_contrat.'" >Télécharger</a>';

在我的路线中,我有以下路线:

Route::group(['middleware' => ['auth','role:account_manager|admin|manager_de_filiale']], function() { 
    Route::get('/modeles_contrat/{id_modele_contrat}/download', [App\Http\Controllers\ModeleController::class, 'download']);
});

在我的控制器中,我有以下代码:

public function download($id_modele_contrat) {
    $data2 = array();
    $data_modele = Model_Contrat::where('id_modele_contrat',$id_modele_contrat)->first();

    $filename = $data_modele->fichier;
    $filepath = 'Casting_V0.1_Test\casting\storage\app\public\uploads\modeles_contrat/'.$filename;

    /*  $filepath = str_replace('', '/',public_path('Model/'.$filename.'.docx'));
*/

    if (file_exists($filepath)) {
        $headers = array(
          'Content-Type: => application/docx',
        );
        return Response::download($filepath,$filename, $headers);
    }
}

所以现在,当我点击链接下载文件,我得到以下页面,文件不下载:

2nc8po8w

2nc8po8w1#

您可以将文件名作为第二个参数传递给Response::download()函数。
试试看:

return Response::download($filepath, $downloadName);

下面是下载功能的文档(Storage::downloadResponse::download应该相同)。

相关问题