загрузка файла странная проблема с размером и расширением

В настоящее время я работаю над скриптом, который позволит пользователям загружать изображения, ничего сложного, всего несколько простых строк кода. Так или иначе, прошлой ночью все работало как по маслу, а теперь неожиданный сюрприз, странные вещи начали происходить ни с того ни с сего неизвестно по какой причине. Тем не менее, важно отметить, что я асинхронно передаю значения с помощью плагина формы jQuery, и эта часть работает безупречно, поэтому я не буду публиковать эту часть кода.

вот код компонента cfc:

<cfcomponent output="false">  

<cffunction name="test" access="remote" output="false">
    <cfparam name="form.title" type="string" default="">
    <cfparam name="form.File" type="string" default="">

    <cfset add.Msg = ArrayNew(1)>

    <!---check if text is added and whether it contains more than 15 characters--->
    <cfif len (trim(form.title)) is 0>
       <cfset ArrayAppend(add.Msg,"plese enter some text")>
    <cfelseif len (trim(form.title)) lt 15>
       <cfset ArrayAppend(add.Msg,"text should be at least 15 characters long")> 
    </cfif>

    <!---check if text contains special characters--->
    <!--additionally we can allow other characters-->
    <cfif refind ("[^A-Z a-z 0-9\\+]+", form.title) and len (trim(form.title)) gte 15>
       <cfset ArrayAppend(add.Msg,"your post can not conatin special characters")>
    </cfif>   

    <!---check to see if file has been submited--->
    <cfif len(form.File) is 0>
       <cfset ArrayAppend(add.Msg,"you haven't selected a file")>
    </cfif>

    <!---if there are no errors try to upload file to temp--->
    <cfif ArrayLen (add.Msg) is 0>
        <cftry>
            <cffile action="upload" nameconflict="makeunique" destination="#GetTempDirectory()#" filefield="File">

            <!---check file size--->
            <cfif (CFFILE.FileSize GT (100 * 1024))>
                <cfset ArrayAppend(add.Msg,"#CFFILE.FileSize#you can not upload files bigger than 1MB")>
                <!---try to delete the file--->
                <cftry>
                    <cffile action="delete" file="#CFFILE.ServerDirectory#\#CFFILE.ServerFile#">
                <cfcatch>
                <!--we dan catch an error , though it would crash the page-->
                </cfcatch>
                </cftry>
             </cfif>   

            <!---check file extension with aditional layer of protection for just in case--->
            <cfif not ListFindnoCase("jpg,jpeg,png,gif",CFFILE.ServerFileExt) 
            or not isImageFile("#GetTempDirectory()##CFFILE.ServerFile#")>
                <cfset ArrayAppend(add.Msg,"#CFFILE.ServerFileExt#you can only upload jpg,png or gif images.")>

                <!---try to delete the file--->
                <cftry>
                    <cffile action="delete" file="#CFFILE.ServerDirectory#\#CFFILE.ServerFile#">
                <cfcatch>
                <!--again we can catch an error, though it would crash the page-->
                </cfcatch> 
                </cftry>
            </cfif>

        <cfcatch>
        <!--if there was an error we could log it, though that would crash the page-->
        </cfcatch>
        </cftry>
    </cfif>




   <cfif ArrayLen (add.Msg) is 0>


   <cfset ArrayAppend(add.Msg,"#CFFILE.ServerFile# - yay! success")>
   </cfif>




    <cfreturn serializeJSON(add.Msg)>
</cffunction>

as you can see it's a simple validation that should work and has worked as I mentioned last night. Now I am having issues with file size and file format validation. That said, whatever I try it returns that file is bigger that 1M and that it's not a correct type, even though I select 300kb file, jpg or png. as you can see i added #CFFILE.FileSize# and #CFFILE.ServerFileExt# to those to error msgs and file is there, it's less than 1MB in size and its correct type. So, WTF is going on here? I would really appreciate your help on this one, if you have any suggestions on how to fix this or how to improve my code.

ИЗМЕНИТЬ

это тестовый клиентский код

$(document).ready(function(){

var options = { 
beforeSend: function() { /* something will go here */ },
uploadProgress: function(event, position, total, percentComplete) { /* maybe in here */ },
    success: function(data) 
    {
        /*test */
        /*alert(data);
        return false;*/
    },
    complete: function(response) 
    {
        /* test */
        alert(response.responseText);
        return false;
    },
    error: function(error)
    {
        /*alert('error');
        return false;*/
    }

}; 

 $("#JqAjaxForm").ajaxForm(options);

});

и форма

<form id="JqAjaxForm" action="cfc/tests.cfc?method=test" method="post" enctype="multipart/form-data">

person user2595617    schedule 14.09.2013    source источник
comment
Не могли бы вы также опубликовать код вызова, ура.   -  person Adam Cameron    schedule 14.09.2013
comment
Адам Я нашел ошибку и смог ее исправить, внимательно прочитав каждую строку кода одну за другой. Очевидно, я не знаю математики :) CFFILE.FileSize GT (100 * 1024) по моим подсчетам составляет 1 МБ, когда на самом деле это 100 КБ, и я пытался передать изображения размером 300 КБ.   -  person user2595617    schedule 14.09.2013
comment
у вас есть другие предложения, как улучшить мой код, сделать его более безопасным? изображения будут храниться в большом двоичном объекте, а INSERT в базу данных будет проходить через объект и cfstoredproc/cfprocparam!   -  person user2595617    schedule 14.09.2013
comment
Я рекомендую опубликовать код в Code Review и задать тот же вопрос. codereview.stackexchange.com. Но эта текущая проблема, которая у вас была, исправлена, да?   -  person Adam Cameron    schedule 14.09.2013
comment
ага, теперь все работает!   -  person user2595617    schedule 14.09.2013
comment
Хорошо, возможно, опубликуйте свое решение как ответ и отметьте его как таковое, чтобы закрыть вопрос. Нет ничего плохого в том, чтобы отвечать на свои вопросы.   -  person Adam Cameron    schedule 14.09.2013


Ответы (1)


Я нашел проблему и смог решить ее самостоятельно. Во всяком случае, мой первоначальный расчет был неверным, CFFILE.FileSize GT (100 * 1024) не 1 МБ, а 100 КБ, поэтому он должен быть CFFILE.FileSize GT (1000 * 1024). Не стесняйтесь использовать приведенный выше код, если он вам нужен.

person user2595617    schedule 14.09.2013