Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: разработка для Web > Форма обратной связи с прикреплением файла


Автор: avadmarkgmail 2.4.2016, 13:59
Доброго времени суток.
Помогите пожалуйста разобраться. Сам уже закипаю. smile 
Что необходимо: На сайте в форме обратной связи добавить возможность прикрепления файлов.
Отсылать сообщение на почту с прикрепленными файлами.
Что есть: Сайт на Perl, БД MySQL
На сколько я понимаю: необходимо в таблицу БД добавить поле с типом mediumBlob. Из формы на сайте записывать файл в БД. А потом отправлять сообщение на почту?

Что у меня не так, помогите. Про что я забыл.  

Код

<form name="feedback" method="post">    
<input type="hidden" name="order" value="1" />                      
<table width="100%" cellpadding="0" cellspacing="0" id="contact">
    
    <tr>
        <th colspan="2"><label for="topic"><TMPL_VAR TEXT_FORM_TOPIC>&nbsp;<img src="/images/star.gif" width="5" height="10" alt="" /></label></td>
    </tr>
    <tr>
        <td colspan="2">
            <TMPL_IF TOPICS_LIST>
                <select name="topic" id="topic">
                    <TMPL_LOOP TOPICS_LIST>
                    <option value="<TMPL_VAR NAME ESCAPE=HTML>"><TMPL_VAR NAME></option>
                    </TMPL_LOOP>
                </select>
            <TMPL_ELSE>
                <input type="hidden" name="topic" value="<TMPL_VAR TOPIC_VALUE ESCAPE=HTML>" />
            </TMPL_IF>
        </td>
    </tr>
    
    <tr>
        <th colspan="2"><label for="topic"><TMPL_VAR TEXT_FORM_RESPONSE>&nbsp;<img src="/images/star.gif" width="5" height="10" alt="" /></label></td>
    </tr>
    <tr>
        <td colspan="2">
            <select name="type">
                <option value="electronic"><TMPL_VAR TEXT_ELECTRO_FORM ></option>
                <option value="written"><TMPL_VAR TEXT_WRITING_FORM ></option>
            </select>
        </td>
    </tr>
    <tr>
        <th colspan="2"><label for="message"><TMPL_VAR TEXT_FORM_MESSAGE>&nbsp;<img src="/images/star.gif" width="5" height="10" alt="" /></label></th>
    </tr>
    <tr>
        <td colspan="2"><textarea  name="message" maxlength="10000" rows="8" id="message"><TMPL_VAR INP_MESSAGE ESCAPE=HTML></textarea></td>
    </tr>
    <tr>
        <td colspan="2"><label for="filename"><TMPL_VAR TEXT_FORM_FILE_NAME><br /> <input type="file" name="file_name"> </label></td>
    </tr> 
    <tr>
        <th width="50%" ></td>
        <th width="50%" >
            <label for="email"><TMPL_VAR TEXT_CAPTCHA>&nbsp;<img src="/images/star.gif" width="5" height="10" alt="" /></label>
        </td>
    </tr>
    <tr>
        <td>
            <img src="/images/captcha/<TMPL_VAR CODE>.png" alt="" />
        </td>
        <td>
            <input type="Text" name="code"  maxlength="50" id="code" value="<TMPL_VAR ESCAPE=HTML CGI_CODE >" />
            <input type="hidden" name="check_code" value="<TMPL_VAR CODE>" />    
        </td>
    </tr>
    <tr>
        <td colspan="2" class="button"><input name="order" type="image" <TMPL_VAR TEXT_SEND_IMG> style="width: 80px;" /></td>
    </tr>

</table>    
</form>  


Код

sub save_feedback {
    my $self = shift;
    my %col  = @_;

    my $id = sh_dblib::newID(
        $self->dbh,
        'sh_feedbacks',
        [qw(id ip name email subject content topicid unread to_mail user_id type lastname file_name)],
        [
            $ENV{REMOTE_ADDR},
            $col{name} || '',
            $col{email},
            $col{topic},
            $col{message},
            $self->topicid,
            1,
            $col{to_mail},
            $col{user_id},
            $col{type},
            $col{lastname},
            $col{file_name}
            
        ],8
    );
    return $id;
}


Код

sub send_feedback {
    my $self = shift;
    my $template = shift;
    my %param = @_;
    
    my %param = reverse @_;
        %param = reverse %param;


    $self->mail_template('modules/emails/' . $template);
    $self->param(%param); $self->param(IP => $ENV{REMOTE_ADDR});
    $self->mail();
    $self->__redirect($self->param('TOPIC_INFO_URL') . 'ok') unless $param{no_redirect};
}



Автор: igorold 3.4.2016, 19:35
А что не получается?
Во-вторых, файл не обязательно в базу пихать, можно во временные папки записывать.

Этот ответ добавлен с нового Винграда - http://ru.vingrad.com/Forma-obratnoy-svyazi-s-prikrepleniyem-fayla-id56ffa634ae2015be0a8b4567#findElement_E7045_57014666ae2015177878c7ab_0

Автор: avadmarkgmail 4.4.2016, 08:12
Не получается: файл не записывается в БД.
А что более правильно, писать в БД или во временные папки? Есть необходимость хранения истории вложенных файлов.
Данной формой пользуются порядком 10 в день.


Этот ответ добавлен с нового Винграда - http://ru.vingrad.com/Forma-obratnoy-svyazi-s-prikrepleniyem-fayla-id56ffa634ae2015be0a8b4567#findElement_E7045_5701f7bcae2015544b78bcfd_0

Автор: igorold 4.4.2016, 12:53
Добавь строку  enctype="multipart/form-data"  в тег <form :
Код

<form name="feedback" method="post" enctype="multipart/form-data">
 

Этот ответ добавлен с нового Винграда - http://ru.vingrad.com/Forma-obratnoy-svyazi-s-prikrepleniyem-fayla-id56ffa634ae2015be0a8b4567#findElement_E7045_5702399fae20152f4d78b446_0

Автор: igorold 4.4.2016, 12:56
Насчет правильности - для каждого случая свой вариант.
Я записываю файлы в папки и привязываю к нужной табличке имя файла, имя папок расчетное, чтобы в одной папке не было слишком много файлов, т.к. на сервере у меня red hat

Этот ответ добавлен с нового Винграда - http://ru.vingrad.com/Forma-obratnoy-svyazi-s-prikrepleniyem-fayla-id56ffa634ae2015be0a8b4567#findElement_E7045_57023a40ae2015f54b78b692_0

Автор: avadmarkgmail 6.4.2016, 16:15
Выдает ошибку:
CGI.pm open of tmpfile /var/tmp/CGItemp7473/Gica.png failed: Read-only file system

Я так понимаю, необходимо открыть доступ к папке /var/tmp/CGItemp7473/ на запись.
Получается файл при добавлении в бд пишется в эту папку а потом только происходит сохранение его?

Этот ответ добавлен с нового Винграда - http://ru.vingrad.com/Forma-obratnoy-svyazi-s-prikrepleniyem-fayla-id56ffa634ae2015be0a8b4567#findElement_E7045_57050be8ae2015203c78b9ed_0

Автор: igorold 6.4.2016, 20:04
да, нужно дать права для всех rwx для папки /var/tmp/CGItemp7473/

Этот ответ добавлен с нового Винграда - http://ru.vingrad.com/Forma-obratnoy-svyazi-s-prikrepleniyem-fayla-id56ffa634ae2015be0a8b4567#findElement_E7045_57054187ae2015567a78b651_0

Автор: igorold 7.4.2016, 07:26
Хотя у меня какие-то временные файлы пишутся в /var/tmp ... без промежуточных файлов.

Этот ответ добавлен с нового Винграда - http://ru.vingrad.com/Forma-obratnoy-svyazi-s-prikrepleniyem-fayla-id56ffa634ae2015be0a8b4567#findElement_E7045_5705e167ae2015323278b921_0

Автор: avadmarkgmail 7.4.2016, 11:39
Возникла еще одна проблема. Хостинг является защищенным, поэтому прав на /var/tmp никаких нету. Можно ли как-то поменять что бы файл заливался на /home/sites/ вместо /var/tmp?

Этот ответ добавлен с нового Винграда - http://ru.vingrad.com/Forma-obratnoy-svyazi-s-prikrepleniyem-fayla-id56ffa634ae2015be0a8b4567#findElement_E7045_57061cd3ae2015aa1d78b5ac_0

Автор: igorold 7.4.2016, 13:22
скорее всего с админами хостинга надо консультироваться.
На нашем сервере для /var/tmp - все права для всех.

Этот ответ добавлен с нового Винграда - http://ru.vingrad.com/Forma-obratnoy-svyazi-s-prikrepleniyem-fayla-id56ffa634ae2015be0a8b4567#findElement_E7045_570634f9ae2015213778b859_0

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)