Upload do arquivo Api do formulário

9

Eu tenho o seguinte código no meu formulário.

$form['new']['upload'] = array(
  '#type' => 'file',
  '#title' => t(''),
  '#size' => 40,
);

No manipulador de envio, ele retorna o nome do arquivo, mas não salva o arquivo e retorna um objeto de arquivo. O que mais eu preciso fazer?

O que estou tentando fazer é criar um bloco no qual você possa fazer upload de um arquivo que ele será salvo no campo de arquivo de um nó.

Lucy
fonte

Respostas:

8

Dê uma olhada em file_save_upload () e as funções que o chamam.

A função manipulará a validação do arquivo e o salvará em um novo local. No Drupal 7, isso também adiciona o arquivo à tabela gerenciada por arquivo.
Observe que o arquivo será armazenado como um arquivo temporário; portanto, defina o status do arquivo como permanente posteriormente.

Provavelmente, você deseja implementar a função file_save_upload dentro do gancho de validação do formulário (antes do manipulador de envio), para poder alertar o usuário se o upload do arquivo falhar ou se não atendeu aos seus requisitos de validação.

Se o nome do campo de imagem que você está tentando validar for image, o primeiro parâmetro de file_save_upload deve ser image, como tal:

$ path = file_save_upload ('imagem', ...);

Essa função retornará o caminho no servidor para o qual a imagem foi carregada (para que você possa, por exemplo, armazenar esse caminho em um campo de banco de dados personalizado).

zroger
fonte
4

Está faltando isso em sua definição de formulário:

   $form['#attributes']['enctype'] = 'multipart/form-data'; // If this is not here, upload will fail on submit

Aqui está a lógica que eu uso para criar um widget de upload de arquivo em um formulário:

   // these give us the file upload widget: 
   $form['#attributes']['enctype'] = 'multipart/form-data'; // If this is not here, upload will fail on submit
   $form['fid'] = array( '#title'        => t('Upload image'),
                         '#type'         => 'file',
                         '#description'  => t('Images must be one of jpg, bmp, gif or png formats.'),
                       ); 

E aqui está a contrapartida dessa lógica, que eu tenho no retorno de chamada válido do meu formulário, porque tenho restrições de nome de arquivo de imagem na minha lógica, mas você pode colocá-lo no envio de retorno de chamada, se desejar:

   // @see: http://api.drupal.org/api/function/file_save_upload/6
   // $file will become 0 if the upload doesn't exist, or an object describing the uploaded file
   $file = file_save_upload( 'fid' );
   error_log( 'file is "'.print_r( $file, true ).'"' );
   if (!$file) {
      form_set_error('fid', t('Unable to access file or file is missing.'));
   }

é isso aí.

Blake Senftner
fonte
3
Você realmente não precisa $form['#attributes']['enctype']no Drupal 7. É feito automaticamente
user724228
3
você não precisa do multipart/form-datadrupal 7, ele é construído no drupal 7 ao usar um campo de arquivo.
FLY
@bsenftner Estou usando o mesmo método que você, mas quando o experimento, acho isso $file === null, o que significa que no file was uploaded(de acordo com as especificações: api.drupal.org/api/drupal/includes!file.inc/function /… ) O que devo fazer nesse caso? Como posso depurar esse tipo de coisa?
Shawn
@ Shawn: você está trabalhando no Drupal 7? Essa lógica foi testada para o Drupal 6. Ainda não tive a chance de experimentá-lo no D7; portanto, se você estiver no D7, "Não sei". Se você está no D6, ele deve estar funcionando - você tem certeza de que 'fid' é o nome do campo do seu widget de upload de arquivos?
Blake Senftner 10/10/12
Sim para ambas as perguntas: tenho certeza de que tenho o nome certo para o widget e estou usando o D7. Eu acho que eu deveria fazer isso uma nova pergunta ...
Shawn
3

Eu tenho uma função de validação genérica que uso principalmente em temas que precisam oferecer suporte ao upload de imagens. Você pode usá-lo como ele ou com pequenas alterações, mas isso deve levá-lo longe.

/**
 * Validate/submit handler used for handling image uploads
 */
function module_upload_image_validate($form, &$form_state) {
  // This is not needed, I use this to use the same validate function
  // for several fields.
  $key = $form['#key'];
  $file = file_save_upload($key, array(
    'file_validate_is_image' => array(),
    'file_validate_extensions' => array('png gif jpg jpeg'),
  ));
  if ($file) {
    // Get the image info to get the correct extension for the uploaded file.
    $info = image_get_info($file->filepath);
    if (file_move($file, 'destination/filename'. $info['extension'], FILE_EXISTS_REPLACE)) {
      // Mark the file for permanent storage.
      file_set_status($file, FILE_STATUS_PERMANENT);
      // Update the files table.
      drupal_write_record('files', $file, 'fid');
      $form_state['values'][$key] = $file->filepath;
    }
    else {
      form_set_error($key, t('Failed to write the uploaded file to the site’s files folder.'));
    }
  }
}

Usando esta função, você obterá o caminho do arquivo como o valor no manipulador de envio de formulários. Você pode querer o ID do arquivo, dependendo do seu uso.

googletorp
fonte