0

大規模なプロジェクトでは、2 つのファイルをアップロードするフォームがあります。フレームワークとして codeigniter を使用しています。フォームのアップロード後、これら 2 つのファイルを電子メールとして送信する必要があります。

メールに添付するには、ファイルのローカル コピーが必要です。したがって、ファイルを一時フォルダーに移動し、[session-id]_my_file_1 と [session-id]_my_file_2 の命名規則を使用します。

最後に、電子メールを送信した後、これらの一時ファイルを削除しようとしました。しかし、unlinkこれらのファイルを削除していません。この理由はわかりません。

私の推測では、アップロード/送信するメール コマンドでまだ使用されている可能性があります。以下は私が書いたコードの概要です。

            $config['upload_path']      = './tmp_holder/';
        $config['allowed_types']    = 'doc|docx|pdf|rtf';
        $config['max_size']         = '10240';
        $config['file_name']        = $this->session->userdata('session_id').'_1';
        $config['overwrite']        = TRUE;

        $config2['upload_path']     = './tmp_holder/';
        $config2['allowed_types']   = 'doc|docx|pdf|rtf';
        $config2['max_size']        = '10240';
        $config2['file_name']       = $this->session->userdata('session_id').'_2';
        $config2['overwrite']       = TRUE;

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


        if ($this->form_validation->run() == FALSE)
        {
            $this->load->view('init_app_form');
        }
        else
        {

            if($this->upload->do_upload('cvFile') === FALSE) {
                $this->load->view('init_app_form');
            }
            else {
                $file1Return = $this->upload->data();

                $this->upload->initialize($config2);
                if($this->upload->do_upload('researchFile') === FALSE) {
                    $this->load->view('init_app_form');
                }
                else {
                    //process data here
                    $file2Return = $this->upload->data();

                    $this->config->load('email');

                    $this->email->initialize($this->config->item('email_conf'));


                    $this->email->from($this->config->item('email_from'), $this->input->post('tname').' '.$this->input->post('fname').' '.$this->input->post('lname'));
                    $this->email->to($this->config->item('email_to'));

                    $this->email->subject('something');
                    $this->email->message('something'); 

                    $this->email->attach($file1Return['full_path']);
                    $this->email->attach($file2Return['full_path']);

                    if( $this->email->send() == false ) {
                        //error
                        echo $this->email->print_debugger(); exit;
                    }

                    $this->email->clear();
                                    ////////////////////////////////
                    @unlink($this->session->userdata('session_id').'_2');
                                    ////////////////////////////////
                    $this->load->view('init_app_success');
                }
                                   ////////////////////////////////
                @unlink($this->session->userdata('session_id').'_1');
                                   ////////////////////////////////
            }

        }

私が行った解決策は、これを行う前に一時フォルダー内のファイルを削除して、以前のファイルをクリアすることでした。しかし、これはクリーンなアプローチではありませんよね? それの訳は:

  1. 他の並列インスタンスによって現在使用されている他のファイルを削除しようとしている可能性があります
  2. 自分自身を送信した後、tmp フォルダーを空にしたい。
4

1 に答える 1

0

コードイグナイターにある file_helper を使用することをお勧めします。

$this->load->helper("file");
delete_files($this->session->userdata('session_id').'_1');

ここにこれに関するドキュメントがあります

于 2013-01-23T23:09:35.087 に答える