Yii2 nhận dữ liệu bài đăng trong bộ điều khiển

Bây giờ, khi bạn tìm nạp các tệp đã tải lên của mình sau khi gửi biểu mẫu bằng cách sử dụng




4, bạn sẽ nhận được một loạt tệp để xử lý

// PHP Server Code to process submitted form
$numUploadedfiles = count[$_FILES['uploadFile']];
for[$i = 0; $i < $numUploadedfiles; $i++]
{
    echo "
filename " . $i . " is: " . $_FILES['uploadFile'][$i]; // or do whatever }

Bài viết này giải thích một vấn đề cụ thể với URL được tạo khi sử dụng phương thức GET với biểu mẫu Yii2. Hãy xem xét, bạn đang sử dụng ActiveForm trong yii [cả v1. x hoặc 2], với phương thức GET như bên dưới

// In Yii 2
$form = ActiveForm::begin[[
    'id' => 'order-search-form',
    'method' => 'get',
]];
echo $form->field[$searchModel, 'id'];
echo Html::submitButton['Find', ['class' => 'btn btn-primary']];
ActiveForm::end[];

// In Yii 1.x
$form = $this->beginWidget['CActiveForm', [
    'id' => 'order-search-form',
    'method' => 'get',
]];
echo $form->textInput[$searchModel, 'id'];
echo CHtml::submitButton['Find', ['class' => 'btn btn-primary']];
$this->endWidget[];

Vấn đề

Khi gửi biểu mẫu, bạn gặp phải tình huống này

  • Ban đầu uri là
    
    
    
    
    5
  • Sau khi gửi biểu mẫu với
    
    
    
    
    6, URL của bạn đọc là
    
    
    
    
    7
  • Sau khi gửi lại biểu mẫu, URL của bạn đọc
    
    
    
    
    8

… và như thế. Tham số




9 trong url như đã thấy, tiếp tục xếp chồng liên tục. Đây không phải là cách chính xác mà bạn mong đợi, khi gửi biểu mẫu bằng phương thức GET

Giải trình

Lý do cho hành vi trên là do cần có một xác thực duy nhất trong phương thức

$form = $this->beginWidget['CActiveForm', array[
    'options'=>['encytype'=>'multipart/form-data']
]];
echo $form->fileInput[$model, 'uploadFile[]', array['multiple' => true]];
$this->endWidget[];
0 của Yii. Các tham số truy vấn trong hành động bị bỏ qua đối với phương thức GET, vì vậy Yii's
$form = $this->beginWidget['CActiveForm', array[
    'options'=>['encytype'=>'multipart/form-data']
]];
echo $form->fileInput[$model, 'uploadFile[]', array['multiple' => true]];
$this->endWidget[];
0 sử dụng các đầu vào ẩn cho mỗi tham số GET để thêm chúng trở lại. Các đầu vào ẩn này được xếp chồng lên nhau trong lệnh gọi URI cuối cùng với mỗi lần gửi

Dung dịch

Để tránh xếp chồng tham số lặp lại, hãy đảm bảo bạn chuyển phương thức hành động trong khi xác định biểu mẫu của mình như bên dưới

// PHP Server Code to process submitted form
$numUploadedfiles = count[$_FILES['uploadFile']];
for[$i = 0; $i < $numUploadedfiles; $i++]
{
    echo "
filename " . $i . " is: " . $_FILES['uploadFile'][$i]; // or do whatever }
0

Điều này sẽ tự động sử dụng URI hành động được đặt ở trên cho mỗi lần gửi biểu mẫu thay vì dựa vào URL từ thanh địa chỉ. Do đó, việc lặp lại và xếp chồng tham số URL sẽ không xảy ra

Bạn có gặp sự cố với yêu cầu không hợp lệ HTTP 400 đối với yêu cầu AJAX và POST trong Yii Framework 2 không. 0?

Ví dụ về vấn đề yêu cầu HTTP không hợp lệ

  • Thay đổi ngày trong tiện ích DateControl từ tiện ích mở rộng yii2-datecontrol dẫn đến lỗi yêu cầu không hợp lệ trên bảng điều khiển javascript của bạn
  • Việc chọn các giá trị trong danh sách thả xuống phụ thuộc trong tiện ích DepDrop từ tiện ích mở rộng yii2-widget dẫn đến lỗi yêu cầu không hợp lệ trên bảng điều khiển javascript của bạn
  • Xuất nội dung dưới dạng HTML hoặc văn bản trong tiện ích MarkdownEditor từ mô-đun đánh dấu yii2 dẫn đến lỗi yêu cầu không hợp lệ trên bảng điều khiển javascript của bạn

Tại sao bạn phải đối mặt với lỗi này?

Một lý do phổ biến, [đặc biệt nếu bạn cài đặt Yii 2 trước tháng 6 năm 2014], là do xác thực CSRF được bật trong thiết lập ứng dụng mặc định của bạn. Kể từ tháng 6 năm 2014, đã có một số thay đổi lớn đối với khung lõi Yii 2 liên quan đến việc tạo thẻ meta CSRF tự động. Tính năng này đã bị xóa khỏi lớp

$form = $this->beginWidget['CActiveForm', array[
    'options'=>['encytype'=>'multipart/form-data']
]];
echo $form->fileInput[$model, 'uploadFile[]', array['multiple' => true]];
$this->endWidget[];
2 cho Yii 2. Đây là cam kết liên quan #6b799d3 và vấn đề liên quan #3558

Dung dịch

Để giải quyết vấn đề, đảm bảo bạn đã nhúng đoạn mã sau vào tệp bố cục chế độ xem của mình Phần

$form = $this->beginWidget['CActiveForm', array[
    'options'=>['encytype'=>'multipart/form-data']
]];
echo $form->fileInput[$model, 'uploadFile[]', array['multiple' => true]];
$this->endWidget[];
3. Tệp bố cục dạng xem [e. g.
$form = $this->beginWidget['CActiveForm', array[
    'options'=>['encytype'=>'multipart/form-data']
]];
echo $form->fileInput[$model, 'uploadFile[]', array['multiple' => true]];
$this->endWidget[];
4] thường nằm trong thư mục ứng dụng của bạn
$form = $this->beginWidget['CActiveForm', array[
    'options'=>['encytype'=>'multipart/form-data']
]];
echo $form->fileInput[$model, 'uploadFile[]', array['multiple' => true]];
$this->endWidget[];
5

Chủ Đề