1

私は現在、ユーザーが画像をアップロードできるようにするスクリプトに取り組んでいます。洗練されたものではなく、ほんの数行の単純なコードです。とにかく、昨夜はすべてが魔法のように機能していましたが、今では驚きの驚き、奇妙なことが突然起こり始めました. とはいえ、 jQuery Form Pluginを使用して値を非同期に渡していることに注意することが重要であり、その部分は問題なく動作しているため、コードのその部分は投稿しません。

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>

ご覧のとおり、これは機能するはずの単純な検証であり、昨夜述べたように機能しています。現在、ファイル サイズとファイル形式の検証に問題があります。そうは言っても、300kbのファイル、jpg、またはpngを選択しても、ファイルが1Mを超えており、正しいタイプではないことを返します。ご覧のとおり、エラーメッセージに #CFFILE.FileSize# と #CFFILE.ServerFileExt# を追加しました。ファイルはそこにあります。サイズは 1MB 未満で、正しいタイプです。それで、WTFはここで起こっていますか?これを修正する方法または私のコードを改善する方法について提案があれば、これについてあなたの助けを本当に感謝します.

編集

これはテスト用のクライアント側コードです

$(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">
4

1 に答える 1

0

私は問題を発見し、自分でそれを整理することができました。とにかく、私の最初の計算は正しくありませんでした。CFFILE.FileSize GT (100 * 1024) は 1MB ではなく 100kb なので、CFFILE.FileSize GT (1000 * 1024) のはずです。必要に応じて、上記のコードを自由に使用してください。

于 2013-09-14T20:30:02.180 に答える