我用的是 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());
}
}
```
希望能帮到你