2016-09-21 7 views
0

私はprestashopを使って作業していて、カートに製品を追加するときにユーザーが自分のファイルをアップロードできるようにしています。PrestaShop:製品のカスタマイズをアップロードするときにファイル名と拡張子を保持する(または少なくとも拡張子)

私はバックエンドでこれを有効にしています。フロントエンドでは、this tutorialに従ってセットアップを行いました。

ここには、ajax呼び出しとファイルのアップロードを処理するコードブロックがあります。私はアップロード時にユーザーが与えたファイルの元の名前と拡張子を保持したいと思います。

これは可能ですか?

アップロードディレクトリに現在のファイルのアップロード
var files = new Array(); 
$('.customizationUploadLine').find('input[type="file"]').on('change', prepareUpload); 
// Grab the files and set them to our variable 
function prepareUpload(event) 
{ 
    files.push({'name' : event.target.name, 'file' :event.target.files[0]}); 
} 



function previewFile(target, file) { 

    $('#uniform-'+target.attr('id')).before($('<img id="preview-'+target.attr('id')+'"/>')); 
    var preview = $('#preview-'+target.attr('id')); 
    var reader = new FileReader(); 

    preview.attr('width', 64); 

    reader.onloadend = function() { 
     preview.attr('src', reader.result); 
    } 

    if (file) { 
     reader.readAsDataURL(file); 
    } else { 
     preview.attr('src', ""); 
    } 
} 


$('#uploadTrigger').click(function(e) { 


    if(files.length > 0) 
    { 

     $('<div class="myoverlay"></div>').css({ 

      'position' : 'fixed', 
      'top' : 0, 
      'left' : 0, 
      'background' : 'black', 
      'background' : 'rgba(0,0,0,.5)', 
      'z-index' : 5999, 
      'width' : '100%', 
      'height' : '100%', 
      'cursor' : 'pointer' 
     }).appendTo('body'); 

     $('<div class="uploadingfiles">Your files are being uploaded...<img src="'+baseUri+'themes/default-bootstrap/img/ajax-loader.gif"></div>') 
      .css({ 
       'position' : 'absolute', 
       'top' : '30%', 
       'left' : '50%', 
       'width' : '300px', 
       'margin-left' : '-150px', 
       'text-align' : 'center', 
       'padding' : '10px', 
       'background' : 'white' 
      }) 
      .appendTo('.myoverlay'); 


     var data = new FormData(); 

     $.each(files, function(key, obj) 
     { 
      data.append(obj.name, obj.file); 
     }); 

     data.append('submitCustomizedDatas', 1); 
     data.append('ajax', 1); 
     $.ajax({ 
      url: $('#customizationForm').attr('action'), 
      type: 'POST', 
      data: data, 
      cache: false, 
      dataType: 'json', 
      processData: false, 
      contentType: false, 
      success: function(data, textStatus, jqXHR) 
      { 
       if(typeof data.errors === 'undefined') 
       { 
        $.each(files, function(key, obj) 
        { 
         $('input[name="'+obj.name+'"]').addClass('filled'); 
         previewFile($('input[name="'+obj.name+'"]'), obj.file); 

        }); 
        $('.uploadingfiles').text('Upload Complete!'); 
       } 
       else 
       { 
        $('.uploadingfiles').text('Error while uploading, please refresh the page and try again'); 
       } 
       $('.myoverlay').click(function(){$(this).remove()}); 
      }, 
      error: function(jqXHR, textStatus, errorThrown) 
      { 
       $('.uploadingfiles').text('ERRORS: ' + errorThrown); 
       $('.myoverlay').click(function(){$(this).remove()}); 
      } 
     }); 

    } // end checking files length 
    else alert('Nothing to upload!'); 
}); 

(素晴らしい!)が、それは、それに関連付けられていない拡張子を持つ本当にファンキーな名前を持っています。画像に名前と拡張子を付けておくと、その情報をチェックアウト画面に渡してアップロードした画像をそこに表示することができます。

答えて

1

それは可能ですが、私はそれをすることを提案しません。ただし、ProductController、特にpictureUpload()メソッドのオーバーライドを行う必要があります。

以下writedコンテンツとProductController.phpという名前prestashop/overidde/controllers/front/に新しいファイルを作成します。同じ名前を持っている今、アップロードされたファイルを

class ProductController extends ProductControllerCore { 

    protected function pictureUpload() 
    { 
     if (!$field_ids = $this->product->getCustomizationFieldIds()) { 
      return false; 
     } 
     $authorized_file_fields = array(); 
     foreach ($field_ids as $field_id) { 
      if ($field_id['type'] == Product::CUSTOMIZE_FILE) { 
       $authorized_file_fields[(int)$field_id['id_customization_field']] = 'file'.(int)$field_id['id_customization_field']; 
      } 
     } 
     $indexes = array_flip($authorized_file_fields); 

     foreach ($_FILES as $field_name => $file) { 
      if (in_array($field_name, $authorized_file_fields) && isset($file['tmp_name']) && !empty($file['tmp_name'])) { 
       // $file_name = md5(uniqid(rand(), true));// Change this 
       $file_name = $file['name']; // In this 
       if ($error = ImageManager::validateUpload($file, (int)Configuration::get('PS_PRODUCT_PICTURE_MAX_SIZE'))) { 
        $this->errors[] = $error; 
       } 

       $product_picture_width = (int)Configuration::get('PS_PRODUCT_PICTURE_WIDTH'); 
       $product_picture_height = (int)Configuration::get('PS_PRODUCT_PICTURE_HEIGHT'); 
       $tmp_name = tempnam(_PS_TMP_IMG_DIR_, 'PS'); 
       if ($error || (!$tmp_name || !move_uploaded_file($file['tmp_name'], $tmp_name))) { 
        return false; 
       } 
       /* Original file */ 
       if (!ImageManager::resize($tmp_name, _PS_UPLOAD_DIR_.$file_name)) { 
        $this->errors[] = Tools::displayError('An error occurred during the image upload process.'); 
       } 
       /* A smaller one */ 
       elseif (!ImageManager::resize($tmp_name, _PS_UPLOAD_DIR_.$file_name.'_small', $product_picture_width, $product_picture_height)) { 
        $this->errors[] = Tools::displayError('An error occurred during the image upload process.'); 
       } elseif (!chmod(_PS_UPLOAD_DIR_.$file_name, 0777) || !chmod(_PS_UPLOAD_DIR_.$file_name.'_small', 0777)) { 
        $this->errors[] = Tools::displayError('An error occurred during the image upload process.'); 
       } else { 
        $this->context->cart->addPictureToProduct($this->product->id, $indexes[$field_name], Product::CUSTOMIZE_FILE, $file_name); 
       } 
       unlink($tmp_name); 
      } 
     } 
     return true; 
    } 
} 

を。あなたは拡張子が必要な場合は、私は今それを行うことがより簡単だと推測prestashop/cache/

class_index.phpを削除することを忘れないでください:)

+0

ありがとう!質問 - なぜそれをすることをお勧めしませんでしたか?セキュリティリスクはありますか? – Hanny

+0

セキュリティ上のリスク私は考えていませんが、2人の顧客が同じ名前のファイルをアップロードするというリモート(ただしあまりにも多い)可能性がありました。 "1.jpg"、残りはつづく) – sarcom

+0

ああ!いい視点ね。おそらく、私はそれに日付/時刻スタンプを追加して、それが発生しないようにします。 ご協力いただきありがとうございます。 – Hanny

関連する問題