哥斯拉 发表于 2023-5-30 22:04:09

Discuz 头像图片上传程序简介

一 . 设置flsah 上传
首先根据程序找到对应的模版是 template/ default/ spacecp_avaster.htm ;
discuz通过 flash上传并且将对应的参数和值传递给php进行处理;
首先运行函数
<script type="text/javascript">
document.write(AC_FL_Runcontent((‘<!--{echo implode("’,’" , $uc avatarflash);}-->’));
</script>
$uc_avatarflash是一个数组,主要是带有flash的各种参数;
通过调用 source/include/spacep_avaster.php文件,
中的 $uc_avatarflash = uc_avatar(S_G[ uid] , ' virtual' , 0 );
设置这个函数的位置实在 \uc_client\ client.php根据调用参数,返回这个数组;

return array(
'width' => 450,
'height' => 253,
'scale' => 'exactfit',
'src' => $uc_avatarflash,
'id' => 'mycamera',
'name' => 'mycamera',
'quality' => 'high',
'bgcolor' => '#ffffff',
'menu' => 'false',
'swliveconnect' => 'true',
'allowscriptAccess' => 'always'
);

这个数据返回给 AC_Fl_RunContent 函数设置 flash的参数;

二、接受参数并处理

原理, flash上传只要是通过生成一个临时文件,在把这个临时的图片文件转
化成16进制数字, 最后,通过 flash_decode降图片以不同尺寸存放到不同的目录

1,生成临时图片文件,调用社区目录下的uc_ server/ control/user.php
中的 onuploadavatar生成临时文件;


2裁切图片(将图片转换成16进制,再进行裁切)
函数位置 :uc_server/control/user.php
函数 : onuploadavatar();



函数flash_decode(); 接收参数 , 将图片裁切成不同尺寸 , 这里的不同尺寸的16进制数据 主要是通过flash传递给php 例如 getgpc(‘avatarl’,’P’);

Discuz智能体 发表于 2025-3-20 08:40:37

在Discuz中,头像上传功能是通过Flash实现的,主要涉及到前端和后端的交互。以下是详细的流程和代码解析:

### 一、设置Flash上传

1. **模板文件**:`template/default/spacecp_avaster.htm`
   - 这个模板文件负责生成前端页面,包含Flash上传组件的HTML代码。
   - 通过`document.write(AC_FL_RunContent(...));`函数生成Flash对象。

2. **Flash参数设置**:
   - `$uc_avatarflash` 是一个数组,包含了Flash上传组件的各种参数。
   - 这个数组通过调用 `source/include/spacecp_avatar.php` 文件中的 `$uc_avatarflash = uc_avatar(S_G, 'virtual', 0);` 函数生成。
   - `uc_avatar` 函数位于 `uc_client/client.php` 文件中,根据传入的参数返回一个包含Flash参数的数组。

   return array(
       'width' => 450,
       'height' => 253,
       'scale' => 'exactfit',
       'src' => $uc_avatarflash,
       'id' => 'mycamera',
       'name' => 'mycamera',
       'quality' => 'high',
       'bgcolor' => '#ffffff',
       'menu' => 'false',
       'swliveconnect' => 'true',
       'allowscriptAccess' => 'always'
   );

   - 这个数组返回给 `AC_FL_RunContent` 函数,用于设置Flash的参数。

### 二、接受参数并处理

1. **生成临时图片文件**:
   - Flash上传的图片会生成一个临时文件。
   - 这个临时文件通过调用 `uc_server/control/user.php` 文件中的 `onuploadavatar` 函数生成。

2. **裁切图片**:
   - 图片裁切的过程是将图片转换成16进制数据,然后进行裁切。
   - 裁切函数 `onuploadavatar` 位于 `uc_server/control/user.php` 文件中。
   - 这个函数会接收Flash传递的参数,并将图片裁切成不同尺寸。

3. **图片处理**:
   - `flash_decode` 函数接收参数,将图片裁切成不同尺寸。
   - 不同尺寸的16进制数据通过Flash传递给PHP,例如通过 `getgpc('avatarl', 'P');` 获取。

### 三、代码示例

以下是一个简化的代码示例,展示如何通过Flash上传头像并处理:

// 在 spacecp_avatar.php 中调用 uc_avatar 函数
$uc_avatarflash = uc_avatar(S_G, 'virtual', 0);

// uc_avatar 函数返回的数组
return array(
    'width' => 450,
    'height' => 253,
    'scale' => 'exactfit',
    'src' => $uc_avatarflash,
    'id' => 'mycamera',
    'name' => 'mycamera',
    'quality' => 'high',
    'bgcolor' => '#ffffff',
    'menu' => 'false',
    'swliveconnect' => 'true',
    'allowscriptAccess' => 'always'
);

// 在 user.php 中处理上传的图片
function onuploadavatar() {
    // 生成临时文件
    $tempFile = $_FILES['avatar']['tmp_name'];
   
    // 将图片转换成16进制数据
    $imageData = file_get_contents($tempFile);
   
    // 裁切图片
    $avatarSmall = $this->resizeImage($imageData, 50, 50);
    $avatarMedium = $this->resizeImage($imageData, 100, 100);
    $avatarLarge = $this->resizeImage($imageData, 200, 200);
   
    // 保存裁切后的图片
    $this->saveAvatar($avatarSmall, 'small');
    $this->saveAvatar($avatarMedium, 'medium');
    $this->saveAvatar($avatarLarge, 'large');
}

// 裁切图片的函数
function resizeImage($imageData, $width, $height) {
    // 这里实现图片裁切逻辑
    // ...
    return $resizedImage;
}

// 保存图片的函数
function saveAvatar($imageData, $size) {
    // 这里实现保存图片逻辑
    // ...
}

### 四、总结

Discuz的头像上传功能通过Flash实现,前端通过Flash组件上传图片,后端通过PHP处理图片并生成不同尺寸的头像。整个过程涉及到Flash参数的设置、临时文件的生成、图片的裁切和保存等步骤。通过理解这些步骤,可以更好地定制和优化Discuz的头像上传功能。

如果你有更多关于Discuz开发的问题,欢迎继续提问!
-- 本回答由 人工智能 AI智能体 生成,内容仅供参考,请仔细甄别。

Discuz智能体 发表于 2025-3-21 16:07:55

在Discuz中,头像上传功能是通过Flash技术实现的,主要涉及到前端Flash上传和后端PHP处理。以下是详细的流程和代码解析:

### 一、设置Flash上传

1. **模板文件**:`template/default/spacecp_avaster.htm`
   - 这个模板文件负责生成Flash上传的HTML代码。
   - 通过`document.write(AC_FL_RunContent(...));`函数来生成Flash对象。

2. **Flash参数设置**:
   - `$uc_avatarflash` 是一个数组,包含了Flash上传所需的各种参数。
   - 这个数组是通过调用 `source/include/spacep_avaster.php` 文件中的 `$uc_avatarflash = uc_avatar(S_G, 'virtual', 0);` 函数生成的。

3. **`uc_avatar` 函数**:
   - 这个函数位于 `\uc_client\client.php` 文件中。
   - 它根据传入的参数生成并返回一个包含Flash参数的数组。

   return array(
   'width' => 450,
   'height' => 253,
   'scale' => 'exactfit',
   'src' => $uc_avatarflash,
   'id' => 'mycamera',
   'name' => 'mycamera',
   'quality' => 'high',
   'bgcolor' => '#ffffff',
   'menu' => 'false',
   'swliveconnect' => 'true',
   'allowscriptAccess' => 'always'
   );

   - 这个数组最终会被传递给 `AC_FL_RunContent` 函数,用于设置Flash的参数。

### 二、接受参数并处理

1. **生成临时图片文件**:
   - Flash上传的图片会生成一个临时文件。
   - 这个临时文件是通过调用 `uc_server/control/user.php` 文件中的 `onuploadavatar` 函数生成的。

2. **裁切图片**:
   - 图片上传后,会通过 `flash_decode` 函数将图片裁切成不同尺寸。
   - 这个函数位于 `uc_server/control/user.php` 文件中。
   - 裁切后的图片会以16进制数据的形式传递给PHP处理。

   function onuploadavatar() {
       // 生成临时文件
       $tempFile = $this->generateTempFile();

       // 裁切图片
       $this->cropImage($tempFile);

       // 将图片转换成16进制
       $hexData = $this->convertToHex($tempFile);

       // 处理不同尺寸的图片
       $this->processDifferentSizes($hexData);
   }

3. **`flash_decode` 函数**:
   - 这个函数接收Flash传递的参数,并将图片裁切成不同尺寸。
   - 裁切后的图片会以16进制数据的形式传递给PHP处理。

   function flash_decode() {
       // 接收参数
       $avatarData = getgpc('avatarl', 'P');

       // 裁切图片
       $this->cropImage($avatarData);

       // 将图片转换成16进制
       $hexData = $this->convertToHex($avatarData);

       // 处理不同尺寸的图片
       $this->processDifferentSizes($hexData);
   }

### 三、总结

- **前端**:通过Flash上传图片,生成临时文件。
- **后端**:通过PHP处理临时文件,裁切图片并生成不同尺寸的头像。
- **关键函数**:`uc_avatar`、`onuploadavatar`、`flash_decode`。

通过这些步骤,Discuz实现了用户头像的上传和裁切功能。如果你有更多关于Discuz开发的问题,欢迎继续提问!
-- 本回答由 人工智能 AI智能体 生成,内容仅供参考,请仔细甄别。
页: [1]
查看完整版本: Discuz 头像图片上传程序简介