第二种情况:可能是图片的路径有问题,你可以右击查看图片属性,确定路径。
第三种情况:也就是你说的内存不足。
<?phpclass FileUpload{
private $filepath //指定上传文件保存的路径
private $allowtype=array("gif","jpg","jpeg","png")//允许上传文件的类型
private $maxsize=1000000//允许上传文件的最大值
private $israndname=true//是否随机重命名,
private $originName//源文件名字
private $tmpFileName//临时文件名字
private $fileType//上传后的文件类型,主要是文件后缀名
private $fileSize//文件尺寸
private $newFileName//新文件名字
private $errorName=0//错误号
private $errorMess=""//用来提供错误报告
//用于对上传文件初始化
//指定上传路径 2·允许的类型 3·限制大小 4·是否使用随机文件名称
//让用户可以不用换位置传参数,后面参数给值不用按照位置或者必须有值
function __construct($options=array()){
foreach($options as $key=>$val){
$key = strtolower($key)
//查看用户参数中的数组下标是否和成员属性名相同
//get_class_vars(get_class($this))得到类属性的数组
//如果$key下标不在这个类属性的数组中,则退出for循环
if (!in_array($key,get_class_vars(get_class($this)))){
continue
}
$this -> setOption($key,$val)
}
}
private function setOption($key,$val){
//让实例化后获取过来的数组下标 = 数组下标的值,这里即为构造函数初始化
//构造函数中调用,等于把所有属性初始化,将来可以直接访问
$this -> $key=$val
}
private function getError(){
$str="上传文件{$this->originName}时出错"
switch($this -> errorNum){
case 4: $str.="没有文件被上传"
break
case 3: $str.="文件只有部分上传"
break
case 2: $str.="上传文件超过了表单的值"
break
case 1: $str.="上传文件超过phpini的值"
break
case -1: $str.="未允许的类型"
break
case -2: $str.="文件过大上传文件不能超过{$this->maxsize}字节"
break
case -3: $str.="上传文件失败"
break
case -4: $str.="建立存放上传文件目录失效,请重新上传指定目录"
break
case -5: $str.="必须指定上传文件的路径"
break
default: $str.="未知错误"
}
return $str.'<br>'
}
//用来检查文件上传路径
private function checkFilePath(){
if(empty($this -> filepath)){
$this -> setOption("errorNum",-5)
return false
}
if(!file_exists($this -> filepath) || !is_writable($this -> filepath)){
if(!@mkdir($this -> filepath,0755)){
$this -> setOption("errorNum",-4)
return false
}
}
return true
}
//用来检查上传文件尺寸大小
private function checkFileSize(){
if($this -> fileSize > $this ->maxsize){
$this -> setOption("errorNum",-2)
return false
}else{
return true
}
}
//用来检查文件上传类型
private function checkFileType(){
if(in_array(strtolower($this->fileType),$this -> allowtype)){
return true
}else{
//如果$this->fileType这个类型 不在$this -> allowtype这个数组中,则把错误号变成-1
$this -> setOption("errorNum",-1)
return false
}
}
private function setNewFileName(){
if($this -> israndname){
$this -> setOption("newFileName",$this->preRandName())
}else{
$this -> setOption("newFileName",$this -> originName)
}
}
//用于检查文件随机文件名
private function preRandName(){
$fileName=date("Ymdhis").rand(100,999)
return $fileName.".".$this -> fileType
}
//用来上传一个文件
function uploadFile($fileField){
//检查文件路径
$return = true
if(!$this -> checkFilePath()){
$this -> errorMess=$this -> getError()
return false
}//获取文件信息
$name = $_FILES[$fileField]['name']
$tmp_name = $_FILES[$fileField]['tmp_name']
$size = $_FILES[$fileField]['size']
$error = $_FILES[$fileField]['error']
if(is_array($name)){//判断获取过来的文件名字是否为数组
$errors=array()//如果为数组则设置为一个数组错误号
for($i=0$i<count($name)$i++){
//循环每个文件即每个类属性赋值或者说初始化属性值 或者初始化构造函数
if($this->setFiles($name[$i],$tmp_name[$i],$size[$i],$error[$i])){
if(!$this->checkFileSize() || !$this->checkFileType()){
//如果上面尺寸或者类型不对,则调用这个错误信息
$errors[$i]=$this->getError()
$return=false
}
}else{
//这里是
$error[]=$this->getError()
$return=false
}
if(!$return)
$this->setFiles()
}
if($return){
$fileNames=array()
for($i=0$i<count($name)$i++){
if($this->setFiles($name[$i],$tmp_name[$i],$size[$i],$error[$i])){
$this->setNewFileName()
if(!$this->copyFile()){
$errors=$this->getError()
$return=false
}else{
$fileNames[$i]=$this->newFileName
}
}
}
$this->newFileName=$fileNames
}
$this->errorMess=$errors
return $return
}else{
//看看$name,$tmp_name,$size,$error这些是否赋值成功 否则返回FALSE
if($this -> setFiles($name,$tmp_name,$size,$error)){
//看看文件大小尺寸是否匹配,不匹配返回FALSE
if($this -> checkFileSize() && $this -> checkFileType()){
//获取新文件名
$this->setNewFileName()
if($this->copyFile()){
return true
}else{
return false
}
}else{
$return=false
}
}else{
$return=false
}
if(!$return){
$this -> errorMess = $this ->getError()
return $return
}
}
}
function copyFile(){//将文件从临时目录拷贝到目标文件夹
if(!$this->errorNum){
//如果传递来的路径有斜杠,则删除斜杠再加上斜杠
//./upload+./
$filepath=rtrim($this->filepath,'/').'/'
//./upload+./+加上随机后的新文件名和后缀
//这里指创建一个新的$filepath.这个文件 像占位符但是为空的
$filepath.=$this->newFileName
//尝试着把临时文件$this->tmpFileName移动到$filepath下哪里覆盖原来的这个文件
if(@move_uploaded_file($this->tmpFileName,$filepath)){
return true
}else{
$this->setOption('errorNum',-3)
return false
}
}else{
return false
}
}
//这里是为了其他剩余的属性进行初始化操作!
private function setFiles($name="",$tmp_name="",$size=0,$error=0){
//这里给错误号赋值
$this -> setOption("errorNum",$error)
//如果这里有错误,直接返回错误
if ($error){
return false
}
$this -> setOption("originName",$name)//复制名字为源文件名
$this -> setOption("tmpFileName",$tmp_name)
$arrstr = explode(".",$name)//按点分割文件名,
//取分割后的字符串数组最后一个 并转换为小写,赋值为文件类型
$this -> setOption("fileType",strtolower($arrstr[count($arrstr)-1]))
$this -> setOption("fileSize",$size)
return true
}
//用来获取上传后的文件名
function getNewFileName(){
return $this -> newFileName
}
//上传失败,后则返回这个方法,就可以产看报告
function getErrorMsg(){
return $this -> errorMess
}
}
?>
============================调用====================================
<?php
require("FileUpload.class.php")
//这里实例化后赋值为数组,数组的下标要对应类中属性的值,否则不能传递值,可以不分先后但是必须一致
$up = new FileUpload(array('israndname'=>'true',"filepath"=>"./upload/",'allowtype'=>array('txt','doc','jpg','gif'),"maxsize"=>1000000))
echo '<pre>'
if($up -> uploadFile("pic")){
print_r($up -> getNewFileName())
} else{
print_r($up -> getErrorMsg())
}
echo '<pre>'
?>
-------------------HTML-------------------------
<html>
<head>
<meta http-quive="content-type" content="text/htmlcharset=utf-8" ></meta>
</head>
<body>
<form action="upload.php" method="post" enctype="multipart/form-data">
shoppic:<input type="file" name="pic[]"><br>
<input type="hidden" name="MAX_FILE_SIZE" value="1000000">
<input type="submit" name="sub" value="添加商品">
</form>
</body>
</html>
-------------------或者HTML-------------------------
<html>
<head>
<meta http-quive="content-type" content="text/htmlcharset=utf-8" ></meta>
</head>
<body>
<form action="upload.php" method="post" enctype="multipart/form-data">
//区别在这里
shoppic:<input type="file" name="pic[]"><br>
shoppic:<input type="file" name="pic[]"><br>
shoppic:<input type="file" name="pic[]"><br>
<input type="hidden" name="MAX_FILE_SIZE" value="1000000">
<input type="submit" name="sub" value="添加商品">
</form>
</body>
</html>
=====================================================================
以上是自己总结的 还没有怎么精简加工过,仅供参考
以上不止可以上传图片,可以上自定义任何文件
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"
tools:ignore="ProtectedPermissions" />
<uses-permission android:name="android.permission.READ_FRAME_BUFFER"
tools:ignore="ProtectedPermissions" />
$target_path = "./test/"//接收文件目录
$target_path = $target_path . basename( $_FILES['uploadedfile']['name'])
if(move_uploaded_file($_FILES['uploadedfile']['tmp_name'], $target_path)) {
echo "The file ". basename( $_FILES['uploadedfile']['name']). " has been uploaded"
} else{
echo "There was an error uploading the file, please try again!" . $_FILES['uploadedfile']['error']
}
private static final String CHARST ="UTF-8"
public boolean uploadFile(File file,String RequestURL,String imgname) {
String BOUNDARY =UUID.randomUUID().toString()// 边界标识 随机生成
String PREFIX ="--",LINE_END ="\r\n"
String CONTENT_TYPE ="multipart/form-data"// 内容类型
try {
URL url =new URL(RequestURL)
HttpURLConnection conn = (HttpURLConnection)url.openConnection()
conn.setReadTimeout(50000)
conn.setConnectTimeout(50000)
conn.setDoInput(true)// 允许输入流
conn.setDoOutput(true)// 允许输出流
conn.setUseCaches(false)// 不允许使用缓存
conn.setRequestMethod("POST")// 请求方式
conn.setRequestProperty("Charset",CHARST)
// 设置编码
conn.setRequestProperty("connection","keep-alive")
conn.setRequestProperty("Content-Type",CONTENT_TYPE +"boundary="
+BOUNDARY)
if (file !=null) {
/** * 当文件不为空,把文件包装并且上传 */
OutputStream outputSteam =conn.getOutputStream()
DataOutputStream dos =new DataOutputStream(outputSteam)
StringBuffer sb =new StringBuffer()
sb.append(PREFIX)
sb.append(BOUNDARY)
sb.append(LINE_END)
/**
* 这里重点注意: name里面的值为服务器端需要key 只有这个key 才可以得到对应的文件
*/
sb.append("Content-Disposition: form-dataname=\"uploadedfile\"filename=\""
+imgname +".png" +"\"" +LINE_END)//file.getName()
sb.append("Content-Type: application/octet-streamcharset="
+CHARST +LINE_END)
sb.append(LINE_END)
dos.write(sb.toString().getBytes())
InputStream is =new FileInputStream(file)
byte[]bytes =new byte[1024]
int len =0
// ImageView img = (ImageView) findViewById(R.id.imageView)
// Bitmap bitmap = BitmapFactory.decodeStream(is)
// img.setImageBitmap(bitmap)
while ((len =is.read(bytes)) != -1) {
dos.write(bytes,0, len)
}
is.close()
dos.write(LINE_END.getBytes())
byte[]end_data = (PREFIX +BOUNDARY +PREFIX +LINE_END).getBytes()
dos.write(end_data)
dos.flush()
dos.close()
/**
* 获取响应码 200=成功 当响应成功,获取响应的流
*/
int res =conn.getResponseCode()
Log.e("111","response code:" +res)
if (res ==200) {
return true
}
}
}catch (MalformedURLException e) {
e.printStackTrace()
}catch (IOException e) {
e.printStackTrace()
}
return false
}
new Thread() {
@Override
public void run() {
String fileName =Environment.getExternalStorageDirectory().getAbsolutePath() +"/facepass/001.png"
File filePic =new File(fileName)
// uploadFile(filePic, "http://10.100.72.152/uploadimg1.php")
// uploadFile(filePic, "http://10.100.72.152/uploadimg1.php")
uploadFile(filePic,"http://10.100.72.152/?c=preson&a=addimg","img")
}
}.start()
if (Build.VERSION.SDK_INT >=23) {
int REQUEST_CODE_CONTACT =101
String[]permissions = {
Manifest.permission.WRITE_EXTERNAL_STORAGE}
//验证是否许可权限
for (String str :permissions) {
if (MainActivity.this.checkSelfPermission(str) !=PackageManager.PERMISSION_GRANTED) {
//申请权限
MainActivity.this.requestPermissions(permissions,REQUEST_CODE_CONTACT)
return
}else {
//这里就是权限打开之后自己要操作的逻辑
}
}
}
欢迎分享,转载请注明来源:夏雨云
评论列表(0条)