Ⅰ 求教php如何接收文件流,,ios android上傳的圖片
請問你的客戶端是將數據流編碼了之後傳遞的么?
客戶端可以直接使用流上傳,不需要進行編碼,然後php獲取後直接保存就可以了,如:
$byte = file_get_contents('php://input');
file_put_contents($filename,$byte);
這樣客戶端不用進行處理,直接向伺服器端寫入數據流就可以了。
Ⅱ php 實現上傳圖片至伺服器的函數
<form method=post action="upload.php" ENCTYPE="multipart/form-data">
<input type="file" name="upload_file">
<input type="submit" name="submit" value="上傳文件">
用PHP上傳時,需要對內容作詳細的檢查,例如是否容許讀寫文件,文件格式、文件大小是否在你指定的大小內等。
<?
$file_size_max = 1000000;
// 限制文件上傳最大容量(bytes)
$store_dir = "/public/www/upload/";
// 上傳文件的儲存位置
$accept_overwrite = true;
//允許讀寫文件
// 檢查文件大小
if ($upload_file_size > $file_size_max) {
echo "對不起,你的文件容量大於規定";
exit;
}
// 檢查讀寫文件
if (file_exists($store_dir . $upload_file_name) &&&& !$accept_overwrite) {
echo "文件已存在,不能再復制";
exit;
}
//復制文件到指定目錄
if (! @ ($upload_file,$store_dir . $upload_file_name)) {
echo "復制文件失敗";
exit;
}
echo "上傳文件完成";
?>
Ⅲ PHP怎麼上傳圖片路徑,怎麼獲取圖片路徑
$filePath 應該是上傳的臨時文件吧,然後將$filePath,這個文件移動到 $uploadPath,$uploadPath,應該就 你已經上傳的圖片的路徑!包含圖片文件的名稱。
Ⅳ php+mysql圖片的插入、顯示操作代碼
如果存圖片流,資料庫會非常龐大,建議還是存路徑,圖片放到統一的目錄下,方便管理
存就是insert 欄位用vchar的存相對路徑就可以了
讀就是查資料庫 然後放到數組里 、
顯示<img src='讀出來的變數'>就可以了
function uploadPhoto ($file) {
$this->result = false;
$this->error = false;
// -- save parameters
$this->_file = $file;
//get path
$this->createUploadDir();
$this->_destination=SystemProperties::$UPLOAD_ROOT_PATH['photo'];
//if (!is_null($allowed)) { $this->_allowed = $allowed; } else { $this->_allowed = array('jpg','jpeg','gif','png'); }
// -- check that FILE array is even set
if (isset($file) && is_array($file) && !$this->upload_error($file['error'])) {
// -- cool, now set some variables
$fileID=$this->_IDGenerator->getNextId('IMAGE');
$fileExt=$this->ext($file['name']);
$fileName =$fileID.'.'.$fileExt;
$this->createFileDir('image',$fileName);
$fileTmp = $file['tmp_name'];
//$fileSize = $file['size'];
//$fileType = $file['type'];
$fileError = $file['error'];
// -- update name
$this->_name = $this->_destination.$fileName;
// -- it's been uploaded with php
if (is_uploaded_file($fileTmp)) {
// -- where to put the file?
$filePath=$this->_fileUtil->getFilePath($fileName);
$output = $this->_destination.$filePath['filePath'];
//resize the img first
$isFileName_f=$this->resizeImage($this->_file,'f',$filePath['noExtFileName'].'_f'.$filePath['ext']);
//or resize the img like this,choosed type in ('a','b','c')
//$isFileName_b=$this->resizeImage($this->_file,'b',$filePath['noExtFileName'].'_b'.$filePath['ext']);
if($isFileName_a==true && $isFileName_b==true && $isFileName_c==true && $isFileName_d==true){
// -- just upload it
if (move_uploaded_file($fileTmp, $output)) {
chmod($output, 0644);
$this->result = basename($this->_name);
return $this->result;
} else {
$this->error("Could not move '$fileName' to '$this->_destination'");
}
}
} else {
$this->error("Possible file upload attack on '$fileName'");
}
} else {
$this->error("Possible file upload attack");
}
}
用php框架的,和純php寫不一樣,但是問題不大就是一個思路,沒有完全通用的代碼,前台加個上傳框,做個form傳到後台就不用寫了吧,傳過來的參數$file就是文件,也是個數組用$_FILE[]能看到,首先校驗後綴名或者前台js校驗,move_uploaded_file這句是最重要的一句,其他都是輔助准備參數而已,意思就是把傳上來的東西放到哪去,路徑加文件名 $output 這個參數就是你要保存到資料庫的值了
Ⅳ php怎麼實現批量上傳圖片不是一張一張選擇之後一起上傳 就是打開文件夾全選直接全部上傳。
獲取路徑下的所有圖片文件名,寫入資料庫或是某個變數,在別的頁面調用程序上傳,再從別的頁面讀出來就行了。
以下是示例代碼:
<?php
function upload($fileName,$filePath)
{
//判斷該文件是否是用戶根據POST方式提交到伺服器的上傳文件
foreach($_FILES[$fileName]['tmp_name'] as $k=>$v)
{
if($_FILES[$fileName]['name'][$k]!="")
{
$result=check($_FILES[$fileName]['size'][$k],$_FILES[$fileName]['type'][$k],$_FILES[$fileName]['name'][$k]);
if($result['error']==1)
{
echo $result['msg']."<br>";
echo "出錯文件:".$result['name']."<br>";
}
else
{
$arrTT=explode(".",$_FILES[$fileName]['name'][$k]);
$extName=$arrTT[count($arrTT)-1];
$NewName=sha1(microtime()).".".$extName;
if(move_uploaded_file($v,$filePath.$NewName));
$arrWW[]=$NewName;
}
}
}
return $arrWW;
}
function check($size,$types,$name)
{
if($size>=5242880)
{
$result['msg']='文件過大!';
$result['error']=1;
$result['name']=$name;
}
$arrType=array('image/pjpeg','image/gif','image/x-png','audio/mp3','application/msword','application/vnd.ms_excel','application/octet-stream','application/vnd.ms-powerpoint');
if(!in_array($types,$arrType))
{
$result['msg']='文件類型不匹配!';
$result['error']=1;
$result['name']=$name;
}
return $result;
}
?>
Ⅵ php 圖片上傳有個小BUG,求大神解答。以下是我的一些代碼
您好,這個是 PHP 的一個 BUG(畢竟是外國人做的,中文支持不太好)。
PHP 中,上傳中文文件基本上都會出錯,所以只要在移動文件時,將文件重命名就可以了。
(如果需要原文件名,只需要將原文件名和重命名後的文件名保存在資料庫中就可以了)
代碼如下(您的代碼有一些漏洞與不規范之處,這里已更正):
//檢測文件MIME類型,如果不是圖片則阻止本次上傳
//不要相信$_FILES['file']['type'],這是可以偽造的
//如果PHP>=5.3.0,則使用finfo函數來獲取文件類型
//因為PHP>=5.3.0放棄了mime_content_type()函數
if(version_compare(PHP_VERSION,'5.3.0','>=')){
$f=finfo(FILEINFO_MIME_TYPE);
$ftype=explode('/',finfo_file($f,$_FILES['file']['tmp_name']));
finfo_close($f);
$f=NULL;
if($ftype[0]!=='image'){
@unlink($_FILES['file']['tmp_file']);
die('文件上傳失敗!<br/>請重新上傳。<br/><ahref="pfabu.html">返回</a>');
}
$ftype=NULL;
}
else{
$ftype=explode('/',mime_content_type($_FILES['file']));
if($ftype[0]!=='image'){
@unlink($_FILES['file']['tmp_file']);
die('文件上傳失敗!<br/>請重新上傳。<br/><ahref="pfabu.html">返回</a>');
}
$ftype=NULL;
}
$link=mysql_connect('localhost','root','123456');
mysql_query('setnames'UTF8'');
mysql_select_db('zhenyu',$link);
//為了防止SQL注入,對數據進行轉義
$pkind=addslashes($_POST['pkind']);
$pname=addslashes($_POST['pname']);
$pshow=addslashes($_POST['pshow']);
$filename_upload=$_FILES['file']['name'];
//Base64編碼後的字元只含有a-zA-Z0-9以及+,/,=
$filename=base64_encode($filename_upload);
//Base64編碼中有一些非文件名可用的字元,把它們替換掉
$filename=strtr($filename,array(
'+'=>'.',
'/'=>'_',
'='=>'-'
)
);
//上傳後的文件保存在proct文件夾
$file_move='proct/'.$filename;
//如果文件已存在,則在文件名後加上-和一個隨機數
//當然,這一部分也可以您自己更改,不會影響結果
if(file_exists($file_move)){
$rand='-'.strval(rand(0,9999));
$file_move.=$rand;
$filename_upload.=$rand;
//因為$rand被其它變數引用,不能直接注銷
//所以將其賦值為NULL,也可達到同樣的釋放內存的效果
$rand=NULL;
}
//判斷文件是否是通過HTTPPOST上傳的
//這可以用來確保惡意用戶無法欺騙程序去訪問本不該訪問的文件,例如/etc/passwd
if(!is_uploaded($_FILES['file']['tmp_name'])){
@unlink($_FILES['file']['tmp_name']);
die('文件上傳失敗!<br/>請重新上傳。<br/><ahref="pfabu.html">返回</a>');
}
//如果文件移動失敗,則顯示錯誤信息
//這樣就不會導致資料庫存儲正常,但文件上傳失敗的情況了
elseif(!move_uploaded_file($_FILES['file']['tmp_name'],$file_move)){
@unlink($_FILES['file']['tmp_name']);
die('文件上傳失敗!<br/>請重新上傳。<br/><ahref="pfabu.html">返回</a>');
}
//這里將重命名後的文件名與原文件名儲存在同一個欄位中,用豎線(|)隔開
//讀取時只需要用explode()分開就可以了
if($mysql=mysql_query("INSERTINTOproct(pkind,pname,ppicture,pshow)VALUES('{$pkind}','{$pname}','{$file_move}|{$_FILES['file']['name']}','{$pshow}')")){
//顯示文件上傳信息
echo'Upload:',$filename_upload,'<br/>';
echo'Size:',strval($_FILES['file']['size']/1024.0),'KB<br/>';
echo'Storedin:',$file_move,'<br/>';
echo'<ahref="pfabu.html">返回</a>';
echo'<script>alert("success");</script>';
}
//如果存入資料庫時失敗
//則顯示錯誤信息
else{
@unlink($_FILES['file']['tmp_name']);
die('文件上傳失敗!<br/>請重新上傳。<br/><ahref="pfabu.html">返回</a>');
}
這樣就可以了。
由於沒有測試,代碼難免會出現一些錯誤,請隨意指出,謝謝!
另外,您還應該考慮到不同用戶上傳同一個文件名的文件的情況,最好是為每個用戶單獨分配一個文件夾。
而且,當一個文件夾下的文件過多(>300)時,會導致讀寫速度變慢,這一點要注意。
解決:
當一個用戶的文件夾下文件有300個時,用戶再上傳文件,就將新的文件保存在另一個文件夾中(如:用戶名加上這個用戶已有的文件夾數量)。
如果還有後續問題,可以聯系我的郵箱:
[email protected]
謝謝!
Ⅶ php thinkphp 怎麼獲取上傳圖片的路徑
$info = $upload->upload ();
$data ['表單名稱'] = $info ['表單名稱'] ['savepath'] . $info ['表單名稱'] ['savename'];
Ⅷ php如何將圖片轉成位元組流
在php中,有文件上傳,那麼php伺服器端可以接收到請求參數 $_FILES,在 $_FILES數組中讀取到上傳文件的form表單名,然後在讀取的數組中可以獲取上傳文件的源文件,使用 fopen()函數就可以獲取文件的位元組流了。
具體來點代碼看看吧:(假定上傳文件的表單名為 「formname」)
if($_FILES && isset($_FILES["formname"])){
//獲取上傳的文件的屬性數組
$_fileinfo = $_FILES["formname"];
//獲取上傳文件的原文件名
$_filename = $_fileinfo["name"];
//獲取上傳文件的大小
$_filesize = $_fileinfo["size"];
//獲取上傳文件的臨時文件名(長文件名)
$_filesource = $_fileinfo["tmp_name"];
//以讀寫方式打開文件,並將資源綁定到一個流上
$_filestream = fopen($_filesource,"ab");
//實現上傳文件,其實質是把臨時文件移動到制定的保存文件的位置
$_newfilename = "../mypath/filename.exp"; //自定義文件名,包含路徑,可以是相對路徑
move_uploaded_file($_filesource, $_newfilename);
}