php explode rn_React Native 用 axios 上传文件 PHP 后端接收不到,是二者之间传输协议问题吗?...

16

2018-04-23 21:46:31 +08:00   b7048e5c0150a989fed46971f5ac1886.png 1

我用的是 react-native-fetch-blob

RN 中是这样写的

```

handleSelectPhoto = () => {

SYImagePicker.asyncShowImagePicker(options)

.then(photos => {

if(photos[0])//如果选择了图片

{

console.log('upload start');

RNFetchBlob.fetch("POST",config.baseUrl + config.avatarUpload,{

'Content-Type' : 'multipart/form-data',

'token':user.password,

'phone':user.teacher_phone,

'isparent':0,

},[

{

name:'file',

filename:photos[0]['uri'],

type:'image/jpg',

data: RNFetchBlob.wrap(photos[0]['uri'])

}

])

.then((response) => response.json())

.then((response) => {

if(1 != response.code)

{

Toast.fail(response.msg);

return false;

}

Toast.info(response.msg);

this.setState({

userAvatar:{uri:config.local + '/public' + response.data.url}

});

})

.catch((err) => {

console.log(err);

Toast.fail('网络异常');

})

console.log(user);

}

})

.catch(err => {

})

}

```

后端是这样写的

```

public function upload()

{

$file = $this->request->file('file');

if (empty($file))

{

$this->error(__('No file upload or server upload limit exceeded'));

}

//判断是否已经存在附件

$sha1 = $file->hash();

$upload = Config::get('upload');

preg_match('/(\d+)(\w+)/', $upload['maxsize'], $matches);

$type = strtolower($matches[2]);

$typeDict = ['b' => 0, 'k' => 1, 'kb' => 1, 'm' => 2, 'mb' => 2, 'gb' => 3, 'g' => 3];

$size = (int) $upload['maxsize'] * pow(1024, isset($typeDict[$type]) ? $typeDict[$type] : 0);

$fileInfo = $file->getInfo();

$suffix = strtolower(pathinfo($fileInfo['name'], PATHINFO_EXTENSION));

$suffix = $suffix ? $suffix : 'file';

$mimetypeArr = explode(',', $upload['mimetype']);

$typeArr = explode('/', $fileInfo['type']);

//验证文件后缀

if ($upload['mimetype'] !== '*' && !in_array($suffix, $mimetypeArr) && !in_array($fileInfo['type'], $mimetypeArr) && !in_array($typeArr[0] . '/*', $mimetypeArr))

{

$this->error(__('Uploaded file format is limited'));

}

$replaceArr = [

'{year}' => date("Y"),

'{mon}' => date("m"),

'{day}' => date("d"),

'{hour}' => date("H"),

'{min}' => date("i"),

'{sec}' => date("s"),

'{random}' => Random::alnum(16),

'{random32}' => Random::alnum(32),

'{filename}' => $suffix ? substr($fileInfo['name'], 0, strripos($fileInfo['name'], '.')) : $fileInfo['name'],

'{suffix}' => $suffix,

'{.suffix}' => $suffix ? '.' . $suffix : '',

'{filemd5}' => md5_file($fileInfo['tmp_name']),

];

$savekey = $upload['savekey'];

$savekey = str_replace(array_keys($replaceArr), array_values($replaceArr), $savekey);

$uploadDir = substr($savekey, 0, strripos($savekey, '/') + 1);

$fileName = substr($savekey, strripos($savekey, '/') + 1);

//

$splInfo = $file->validate(['size' => $size])->move(ROOT_PATH . '/public' . $uploadDir, $fileName);

if ($splInfo)

{

$imagewidth = $imageheight = 0;

if (in_array($suffix, ['gif', 'jpg', 'jpeg', 'bmp', 'png', 'swf']))

{

$imgInfo = getimagesize($splInfo->getPathname());

$imagewidth = isset($imgInfo[0]) ? $imgInfo[0] : $imagewidth;

$imageheight = isset($imgInfo[1]) ? $imgInfo[1] : $imageheight;

}

$params = array(

'filesize' => $fileInfo['size'],

'imagewidth' => $imagewidth,

'imageheight' => $imageheight,

'imagetype' => $suffix,

'imageframes' => 0,

'mimetype' => $fileInfo['type'],

'url' => $uploadDir . $splInfo->getSaveName(),

'uploadtime' => time(),

'storage' => 'local',

'sha1' => $sha1,

);

$attachment = model("attachment");

$attachment->data(array_filter($params));

$attachment->save();

\think\Hook::listen("upload_after", $attachment);

//进行身份判断 将头像 url 写入到数据库中

if(isset($this->user['teacher_phone']))

{

db('teacher')->where('teacher_phone',$this->user['teacher_phone'])

->setField('avatar',$uploadDir . $splInfo->getSaveName());

}

else if (isset($this->user['parent_phone']))

{

db('parents')->where('parent_phone',$this->user['parent_phone'])

->setField('avatar',$uploadDir . $splInfo->getSaveName());

}

$this->success(__('Upload successful'), $attachment);

}

else

{

// 上传失败获取错误信息

$this->error($file->getError());

}

}

```

希望能帮到你

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值