3

以下のコードのスターターとして使用したこのスクリプトhttp://d.danylevskyi.com/node/7を見つけました。

目標は、ユーザーの写真を保存できるようにすることです。

<?php
define('DRUPAL_ROOT', getcwd());

require_once DRUPAL_ROOT . '/includes/bootstrap.inc';
drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);

$uid = 99;
$account = user_load($uid);

// get image information
$image_path = 'public://avatars/upload/b8f1e69e83aa12cdd3d2babfbcd1fe27_4.gif';
$image_info = image_get_info($image_path);

// create file object
$file = new StdClass();
$file->uid = $uid;
$file->uri = $image_path;
$file->filemime = $image_info['mime_type'];
$file->status = 0; // Yes! Set status to 0 in order to save temporary file.
$file->filesize = $image_info['file_size'];

// standard Drupal validators for user pictures
$validators = array(
    'file_validate_is_image' => array(),
    'file_validate_image_resolution' => array(variable_get('user_picture_dimensions', '85x85')),
    'file_validate_size' => array(variable_get('user_picture_file_size', '30') * 1024),
);

// here all the magic :) 
$errors = file_validate($file, $validators);
if (empty($errors)) {

    file_save($file);
    $edit['picture'] = $file;
    user_save($account, $edit);
}
?>

画像は、picture-99-1362753611.gif という名前で、sites/default/files/pictures/ に作成されます。

次の点を除いて、file_managed テーブルではすべてが正しいようです。

  1. ファイル名フィールドが空です
  2. uri フィールドは public://avatars/upload/b8f1e69e83aa12cdd3d2babfbcd1fe27_4.gif を示します
  3. ステータス フィールドは 0 (一時的) に設定されます

users テーブルの画像フィールドは、上記のエントリの fid で更新されます。

file_managed テーブルには、元のファイル情報の代わりに最終ファイル (sites/default/pictures 内) を格納する必要があり、users テーブルもそのファイルにリンクする必要があると思います。

どうすればそれを達成できるのでしょうか?私は Drupal API にまったく慣れていません。ありがとうございました。

編集:

元のファイルを file_save および user_save 関数に渡すことを理解しています。しかし、実際に sites/default/pictures/ にファイルを作成するのはどれですか?

4

1 に答える 1

5

コードに以下を追加してみてください。

$file->filename = drupal_basename($image_path);
$file->status   = FILE_STATUS_PERMANENT;
$file = file_save($file);  // Use this instead of your current file_save

それは役に立ちますか?

- - - - - - - - - 編集 - - - - - - - - -

ファイルのコピーを新しい場所に保存する場合は、上記の3行目を次のように置き換えることができます。

// Save the file to the root of the files directory.
  $file = file_copy($file, 'public://');
于 2013-03-08T15:49:32.813 に答える