2016-09-21 76 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()方法。

prestashop/overidde/controllers/front/命名ProductController.php與內容如下所著創建一個新的文件:

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; 
    } 
} 

現在上傳的文件具有相同的名稱。記得刪除class_index.phpprestashop/cache/

如果你需要我想,現在它更容易做到:)

+0

感謝延伸!問題 - 爲什麼你不會推薦這樣做?是否存在安全風險? – Hanny

+0

我不認爲存在安全風險,但有兩個客戶上傳同名文件的可能性很小(但不是太多),例如, 「1.jpg」,其餘如下;) – sarcom

+0

啊!好點子。也許我會附加一個日期/時間標記,以防止發生。 感謝您的幫助! – Hanny