如何在上传时一次重命名多个图像

时间:2013-11-11 12:11:44

标签: php image-uploading

我首先描述了这段代码,它做了什么

/**
* Stores any image uploaded from the edit form
*
* @param assoc The 'image' element from the $_FILES array containing the file upload data
*/ 

public function storeUploadedImage( $image ) {

if ( $image['error'] == UPLOAD_ERR_OK )
{
  // Does the Article object have an ID?
  if ( is_null( $this->id ) ) trigger_error( "Article::storeUploadedImage(): Attempt to upload an image for an Article object that does not have its ID property set.", E_USER_ERROR );

  // Delete any previous image(s) for this article
  $this->deleteImages();

  // Get and store the image filename extension
  $this->imageExtension = strtolower( strrchr( $image['name'], '.' ) );

  // Store the image

  $tempFilename = trim( $image['tmp_name'] );

  if ( is_uploaded_file ( $tempFilename ) ) {
    if ( !( move_uploaded_file( $tempFilename, $this->getImagePath() ) ) ) trigger_error( "Article::storeUploadedImage(): Couldn't move uploaded file.", E_USER_ERROR );
    if ( !( chmod( $this->getImagePath(), 0666 ) ) ) trigger_error( "Article::storeUploadedImage(): Couldn't set permissions on uploaded file.", E_USER_ERROR );
  }

  // Get the image size and type
  $attrs = getimagesize ( $this->getImagePath() );
  $imageWidth = $attrs[0];
  $imageHeight = $attrs[1];
  $imageType = $attrs[2];

  // Load the image into memory
  switch ( $imageType ) {
    case IMAGETYPE_GIF:
      $imageResource = imagecreatefromgif ( $this->getImagePath() );
      break;
    case IMAGETYPE_JPEG:
      $imageResource = imagecreatefromjpeg ( $this->getImagePath() );
      break;
    case IMAGETYPE_PNG:
      $imageResource = imagecreatefrompng ( $this->getImagePath() );
      break;
    default:
      trigger_error ( "Article::storeUploadedImage(): Unhandled or unknown image type ($imageType)", E_USER_ERROR );
  }

  // Copy and resize the image to create the thumbnail
  $thumbHeight = intval ( $imageHeight / $imageWidth * ARTICLE_THUMB_WIDTH );
  $thumbResource = imagecreatetruecolor ( ARTICLE_THUMB_WIDTH, $thumbHeight );
  imagecopyresampled( $thumbResource, $imageResource, 0, 0, 0, 0, ARTICLE_THUMB_WIDTH, $thumbHeight, $imageWidth, $imageHeight );

  // Save the thumbnail
  switch ( $imageType ) {
    case IMAGETYPE_GIF:
      imagegif ( $thumbResource, $this->getImagePath( IMG_TYPE_THUMB ) );
      break;
    case IMAGETYPE_JPEG:
      imagejpeg ( $thumbResource, $this->getImagePath( IMG_TYPE_THUMB ), JPEG_QUALITY );
      break;
    case IMAGETYPE_PNG:
      imagepng ( $thumbResource, $this->getImagePath( IMG_TYPE_THUMB ) );
      break;
    default:
      trigger_error ( "Article::storeUploadedImage(): Unhandled or unknown image type ($imageType)", E_USER_ERROR );
  }

  $this->update();
}
}


/**
* Deletes any images and/or thumbnails associated with the article
*/

public function deleteImages() {

// Delete all fullsize images for this article
foreach (glob( ARTICLE_IMAGE_PATH . "/" . IMG_TYPE_FULLSIZE . "/" . $this->id . ".*") as $filename) {
  if ( !unlink( $filename ) ) trigger_error( "Article::deleteImages(): Couldn't delete image file.", E_USER_ERROR );
}

// Delete all thumbnail images for this article
foreach (glob( ARTICLE_IMAGE_PATH . "/" . IMG_TYPE_THUMB . "/" . $this->id . ".*") as $filename) {
  if ( !unlink( $filename ) ) trigger_error( "Article::deleteImages(): Couldn't delete thumbnail file.", E_USER_ERROR );
}

// Remove the image filename extension from the object
$this->imageExtension = "";
}


/**
* Returns the relative path to the article's full-size or thumbnail image
*
* @param string The type of image path to retrieve (IMG_TYPE_FULLSIZE or IMG_TYPE_THUMB). Defaults to IMG_TYPE_FULLSIZE.
* @return string|false The image's path, or false if an image hasn't been uploaded
*/

public function getImagePath( $type=IMG_TYPE_FULLSIZE ) {
return ( $this->id && $this->imageExtension ) ? ( ARTICLE_IMAGE_PATH . "/$type/" . $this->id . $this->imageExtension ) : false;
}  
  1. 每篇文章上传一张图片和一张缩略图
  2. 重命名图像(例如,如果数据库文章标识为5,重命名后的完整大小和缩略图图像将为5)
  3. 我想修改一个CMS,每个文章只允许上传一张图片。所以我的目的是每篇文章上传5张图片。

    我的第二个意图是按照文章标题重命名每个文件(例如,如果文章标题是诺基亚N9,上传时的第一张图片将是nokia_n9_1.jpg,第二张将是nokia_n9_2.jpg,左边是也是第1和第2。

    我是PHP OOP的新手。我知道要完成这项工作还有很多工作要做。帮助将不胜感激。 如果要查看完整的CMS源代码,请查看链接

    http://www.elated.com/articles/cms-in-an-afternoon-php-mysql/

    http://www.elated.com/articles/add-image-uploading-to-your-cms/

1 个答案:

答案 0 :(得分:0)

实际上,进行此更改不是OOP:

所以在admin.php中你有这个:

// User has posted the article edit form: save the new article
 $article = new Article;
 $article->storeFormValues( $_POST );
 $article->insert();
 if ( isset( $_FILES['image'] ) ) $article->storeUploadedImage( $_FILES['image'] );
 header( "Location: admin.php?status=changesSaved" );

请考虑阅读此http://www.php.net/manual/en/features.file-upload.post-method.php以了解我们将要做出的更改。所以修改admin php到这个:

// User has posted the article edit form: save the new article
  $article = new Article;
  $article->storeFormValues( $_POST );
  $article->insert();
  if ( isset( $_FILES['image'] ) ) $article->storeUploadedImage( $_FILES['image'], '1' );
  if ( isset( $_FILES['image2'] ) ) $article->storeUploadedImage( $_FILES['image2'], '2' );
  if ( isset( $_FILES['image3'] ) ) $article->storeUploadedImage( $_FILES['image3'], '3' );
  if ( isset( $_FILES['image4'] ) ) $article->storeUploadedImage( $_FILES['image4'], '4' );
  if ( isset( $_FILES['image5'] ) ) $article->storeUploadedImage( $_FILES['image5'], '5' );
  header( "Location: admin.php?status=changesSaved" );

修改article.php:

找到这个

public function storeUploadedImage( $image ) {

更改为:

public function storeUploadedImage( $image, $postfix ) {

也找到了这个:

  if ( is_uploaded_file ( $tempFilename ) ) {
     if ( !( move_uploaded_file( $tempFilename, $this->getImagePath() ) ) ) trigger_error( "Article::storeUploadedImage(): Couldn't move uploaded file.", E_USER_ERROR );
     if ( !( chmod( $this->getImagePath(), 0666 ) ) ) trigger_error( "Article::storeUploadedImage(): Couldn't set permissions on uploaded file.", E_USER_ERROR );
  }

改为:

  $image_name = implode( '_', explode( ' ', $this->title ) ) . '_' . $postfix; 
  if ( is_uploaded_file ( $tempFilename ) ) {
     if ( !( move_uploaded_file( $tempFilename, $this->getImagePath( IMG_TYPE_FULLSIZE, $image_name ) ) ) ) trigger_error( "Article::storeUploadedImage(): Couldn't move uploaded file.", E_USER_ERROR );
     if ( !( chmod( $this->getImagePath(IMG_TYPE_FULLSIZE, $image_name), 0666 ) ) ) trigger_error( "Article::storeUploadedImage(): Couldn't set permissions on uploaded file.", E_USER_ERROR );
  }

最后用这个替换getImagePath方法(函数):

public function getImagePath( $type=IMG_TYPE_FULLSIZE, $title = null ) {
    if( $title !== null )
    {
        return ( $this->imageExtension ) ? ( ARTICLE_IMAGE_PATH . "/$type/" . $title . $this->imageExtension ) : false;
    }
    else
    { 
        return ( $this->id && $this->imageExtension ) ? ( ARTICLE_IMAGE_PATH . "/$type/" . $this->id . $this->imageExtension ) : false;
    }
} 

您还必须修改表单以上传图片:

      <li>
        <label for="image">New Image</label>
        <input type="file" name="image" id="image" placeholder="Choose an image to upload" maxlength="255" />
        <label for="image2">New Image2</label>
        <input type="file" name="image2" id="image2" placeholder="Choose an image to upload" maxlength="255" />
        ...
      </li>