2011-03-06 43 views
8

我試圖在CodeIgniter中進行文件上傳,但是如果我添加enctype =「multipart form-data」,那麼無論發佈的數據是否會通過。甚至連其他領域都沒有。但是,當我不添加它,我可以得到其他發佈數據,但當然沒有文件上傳。這裏出了什麼問題。這裏是我的視圖和控制器:CodeIgniter來自發布數據不經過

查看:只有

<h2>Add a New Album</h2> 
<form enctype="multipart/form-data" method="post" action="<?php echo base_url();?>index.php/photo/newAlbum"> 

          <table style="margin-left:5px;"> 
           <tr> 
            <td>  Album Name:</td> 
            <td><input type="text" name="name" /></td> 
           </tr> 
           <tr> 
            <td>  Photo .zip File:</td> 
            <td><input type="file" name="userfile" size="20" /></td> 
           </tr> 
           <tr> 
            <td></td> 
            <td><input type="submit" value="Upload Photo File" /></td> 
           </tr> 
          </table> 

</form> 

控制器包含:

var_dump($_POST); 

結果是:

array(0) { } 
+1

控制器的照片,方法是newAlbum - 我假設的var_dump是方法 - 什麼是指數和構造? – bensiu 2011-03-06 04:00:54

回答

1

有趣。你發佈的代碼應該可以工作。我用你的表單做了一個快速測試腳本,$ _FILES和$ _POST數據都很好。

我發現原來這先前的問題:PHP--parsing multipart form data

這聽起來像你有同樣的問題。不幸的是,這個問題沒有得到真正的答案。我認爲這可能是一個服務器配置問題 - 你可以嘗試在另一臺服務器上的相同代碼,看看它的功能?

的我能找到的唯一信息等位是在回答這個問題,$_POST data returns empty when headers are > POST_MAX_SIZE

如果您嘗試上傳文件太大,顯然這會導致PHP扔掉$ _ POST數據作爲好。但是,如果您嘗試提交表單而未上傳文件(但仍使用「multipart/form-data」),但仍未看到任何$ _POST數據通過,則不適用。

+0

CodeIgniter設置'$ _POST','$ _GET'等等作爲安全措施,並提供一種通過'$ this-> input-> get(「Foo」)訪問它們的託管方式;'似乎託管訪問未填充多部分形式 – Basic 2011-08-21 04:17:53

+1

默認情況下,它不會銷燬全局$ _GET數組,並且它似乎永遠不會取消設置$ _POST全局。可以使用$ config ['allow_get_array'] = FALSE'銷燬$ _GET數組,但$ _POST數組似乎保持不變。如果索引不存在,輸入幫助函數只會通過返回false來簡化從這些數組中檢索。否則只要設置$ _POST ['foo']'$ this-> input-> post('foo')'和'$ _POST ['foo']'是等價的。 [CodeIgnitor用戶指南條目](http://codeigniter.com/user_guide/libraries/input.html) – ToothlessRebel 2011-11-30 19:53:43

2

實際上,像image/zip或其他一些blob數據的多部分數據將包含在$ _FILES數組中,而不是$ _POST數組。
我建議您使用上傳庫。

觀點:upload_form.php

<html> 
<head> 
<title>Upload Form</title> 
</head> 
<body> 

<?php echo $error;?> 

<?php echo form_open_multipart('upload/do_upload');?> 

<input type="file" name="userfile" size="20" /> 

<br /><br /> 

<input type="submit" value="upload" /> 

</form> 

</body> 
</html> 

觀點:upload_success.php

<html> 
<head> 
<title>Upload Form</title> 
</head> 
<body> 

<h3>Your file was successfully uploaded!</h3> 

<ul> 
<?php foreach($upload_data as $item => $value):?> 
<li><?php echo $item;?>: <?php echo $value;?></li> 
<?php endforeach; ?> 
</ul> 

<p><?php echo anchor('upload', 'Upload Another File!'); ?></p> 

</body> 
</html> 

控制器:upload.php的

<?php 

class Upload extends CI_Controller { 

function __construct() 
{ 
    parent::__construct(); 
    $this->load->helper(array('form', 'url')); 
} 

function index() 
{ 
    $this->load->view('upload_form', array('error' => ' ')); 
} 

function do_upload() 
{ 
    $config['upload_path'] = './uploads/'; 
    $config['allowed_types'] = 'gif|jpg|png'; 
    $config['max_size'] = '100'; 
    $config['max_width'] = '1024'; 
    $config['max_height'] = '768'; 

    $this->load->library('upload', $config); 

    if (! $this->upload->do_upload()) 
    { 
    $error = array('error' => $this->upload->display_errors()); 

    $this->load->view('upload_form', $error); 
    } 
    else 
    { 
    $data = array('upload_data' => $this->upload->data()); 

    $this->load->view('upload_success', $data); 
    } 
} 
} 
?> 

而這一切

1

檢查CI層中可能的錯誤重定向。這可能是由錯誤的URL請求引起的(例如,URL末尾缺少斜槓'/')。重定向刪除任何POST數據(我正在處理這個)。

因此,請確保您在表單操作中使用完整網址。

檢查你的.htaccess和$config['uri_protocol']的一致性。

2

您需要修復您的do_upload,就像這樣..

$this->upload->do_upload('name-of-input-file-element-of-your-form') 

例如,在您的視圖代碼,您有:

<input type="file" name="userfile" size="20" /> 

所以,你do_upload線,應該是這樣的:

$this->upload->do_upload('userfile') 

Saludos!

1

我剛剛有同樣的問題。 我這樣解決了。在application/config/config.php中,您設置了base_url ,請注意,此url必須與您的網絡應用程序 相同。對我而言,我用www.sdfsd.com打電話給我的域名,但在配置文件 中,我寫了http://sdfsd.com,所以表單的POST不起作用。所以我改變了這個 現在一切正常!

歡呼聲

+0

請注意,如果您使用完整的網址,則您的基本網址必須與表單的「操作」屬性相匹配。例如,如果'base_url = http:// www.mysite.com'並且你使用'

'你會收到一個空的$ _POST數組。 – ToothlessRebel 2011-11-30 19:51:42

0

我也有這個問題。我不同意以上的答案。我認爲關鍵的是你試圖獲得發佈數據的控制器在什麼階段。也許你可以發佈你的控制器的相關部分。我發現郵寄數據和上傳數據只有在您致電後纔可用

this->upload->do_upload() 

很明顯,您使用if語句來檢查成功。如果成功的話,

$this->upload->data() 

返回標準陣列對上傳的文件信息和

$this->input->post('name_of_your_form_element') 

填充了你在相關的表單元素輸入的內容。

3

您可以添加這種形式的屬性:
enctype="multipart/form-data;charset=utf-8"
相反的:
enctype="multipart/form-data"
你可以看到這個link

+0

Thanks @Mustafa,這解決了我已經有好幾天的問題了。 – 2014-05-21 19:50:58