프로덕션 서버에서는 업로드할 수 있지만 개발 서버에서는 업로드할 수 없는 문제

StackOverflow https://stackoverflow.com/questions/1229854

  •  22-07-2019
  •  | 
  •  

문제

어쩌면 간단한 질문일지도 모르지만 실제로 무엇을 해야할지 모르겠습니다.

다음을 사용하여 양식을 통해 파일을 제출할 때 <asp:FileUpload>, 내 개발 컴퓨터에서 완벽하게 작동합니다.

서버에서 동일한 작업을 시도하면 아래 오류가 발생합니다.내 코드에는이 기능이 없기 때문에 오류는 전혀 도움이되지 않습니다 (CaptureCollection) "i"라는 변수가 없습니다.그래서 지금은 정말 모르겠습니다.

이것은 서버에 대한 올바른 질문입니까(가능한 모든 권한을 부여했는데 오류가 여전히 존재하기 때문에 그렇게 생각하지 않습니다), 내 코드에 있는 것입니까(그러나 내 개발 컴퓨터에서는 작동합니다...).필요한 경우 더 많은 코드를 보여드릴 수 있습니다!

오류:

Server Error in '/' Application.
--------------------------------------------------------------------------------

Specified argument was out of the range of valid values.
Parameter name: i 
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. 

Exception Details: System.ArgumentOutOfRangeException: Specified argument was out of the range of valid values.
Parameter name: i

Source Error: 

An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.  

Stack Trace: 


[ArgumentOutOfRangeException: Specified argument was out of the range of valid values.
Parameter name: i]
   System.Text.RegularExpressions.CaptureCollection.GetCapture(Int32 i) +5227599
   System.Text.RegularExpressions.CaptureCollection.get_Item(Int32 i) +4
   CreatePost.btnFinish_Click(Object sender, EventArgs e) +143
   System.EventHandler.Invoke(Object sender, EventArgs e) +0
   System.Web.UI.WebControls.Button.OnClick(EventArgs e) +111
   System.Web.UI.WebControls.Button.RaisePostBackEvent(String eventArgument) +110
   System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument) +10
   System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument) +13
   System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData) +36
   System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +1565

업로드를 수행하는 코드는 다음과 같습니다.그리고 어쩌면 당신이 정규식을 사용하는 것이 옳을 수도 있습니다.그런데 왜 프로덕션에서는 작동하지 않고 개발에서는 작동합니까?

protected void btnFinish_Click(object sender, EventArgs e)
{
    string file = "";
    string csFinalPath = "";

    if (uploadPhoto.HasFile)
    {
        string filepath = uploadPhoto.PostedFile.FileName;
        string pat = @"\\(?:.+)\\(.+)\.(.+)";
        Regex r = new Regex(pat);

        //run
        Match m = r.Match(filepath);
        string file_ext = m.Groups[2].Captures[0].ToString();
        string filename = m.Groups[1].Captures[0].ToString();
        file = filename + "." + file_ext;

        //save the file to the server 
        uploadPhoto.PostedFile.SaveAs(Server.MapPath(".\\upload\\") + file);

        ThumbnailGenerator thumbGenerator = new ThumbnailGenerator();

        if (thumbGenerator.GetThumbnail(Server.MapPath(".\\upload\\") + file,
        Server.MapPath(".\\upload\\thumb\\") + "Thumb" + file))
        {
            csFinalPath = "./upload/thumb/" + "Thumb" + file;
        }
        else
        {
            //TODO: Do an error message!!!
        }
    }
    else
    {
        csFinalPath = "./images/no_image.gif";
    }

    m_database.InsertPost(Convert.ToInt32(Session["ID"].ToString()),
        Convert.ToInt32(ddlCategory.SelectedValue),
        m_nType,
        txtLink.Text,
        txtTitreFR.Text,
        txtTitreEN.Text,
        txtDescriptionFR.Text,
        txtDescriptionEN.Text,
        csFinalPath,
        "",
        "");

    panelLink.Visible = false;
    panelResult.Visible = true;

}
도움이 되었습니까?

해결책

코드를 게시해야하지만 어둠 속에서 촬영하려면 ...

페이지의 btnfinish_click 메소드에는 정규 표현식을 사용하려는 위치에 문제가 있습니다.

아마도 당신은 아마도 Regex 경기 그룹을 캡처하고 실제로 아무것도 없을 때 열거하려고 시도했을 것입니다. (또는 컬렉션/목록보다 더 많은 항목을 통과하는 루프가 있습니다.)

편집하다: 나는 99%가 여기에 있다고 확신합니다.

Match m = r.Match(filepath);

다른 일을하기 전에이 줄 뒤에 그룹이 있는지 확인하십시오.

if (m.Groups.Count == 0) { DoSomethingElseHere(); }

그런 다음 해당 그룹에 캡처가 있는지 확인하십시오.

if (m.Groups[0].Captures.Count == 0) { DoSomethingElseHere(); }

궁극적 으로이 작업을 수행함으로써 입력에 무엇이 잘못되고 있는지 알 수 있지만 코드를 살펴보고 적극적으로 디버깅하지 않으면 이것이 유일한 좋은 방법입니다.

편집 2 : 그건 그렇고, 원칙적 으로이 문제를 겪는 이유는 사용하기 전에 입력을 실제로 검증하지 않았기 때문입니다. 내가 방금 샘플로 제공 한 코드는 당신을 시작할 것이지만, 당신은 항상 당신에게 오는 것을 소독해야합니다.

또한 업로드 컨트롤을 사용하는 경우 모든 브라우저가 파일 (IE Server share file.ext)으로 전체 UNC 경로로 전달되는 것은 아닙니다. 일부는 파일 이름 자체로 전달됩니다. 확인해야 할 사항.

다른 팁

string file_ext = m.Groups[2].Captures[0].ToString(); string filename = m.Groups[1].Captures[0].ToString();

귀하의 코드는 그룹이 존재한다고 가정합니다. 어떤 이유로 (정직하게는 Regex-Fu가 없습니다) 당신은 항상 생산에 존재해야한다고 생각하는 그룹을 얻지 못합니다. 여기에 m이 있는지 확인하고 M.groups와 m.groups.count> = 2가 있고 M.groups []는 해당 메소드를 호출하기 전에 캡처합니다.

프로덕션 환경에서 파일을 다른 위치에 배치할 수도 있습니다.프로덕션 서버가 파일을 배치하는 폴더와 개발이 수행되는 위치를 확인해보세요.이러한 문제는 개발 및 라이브가 다른 운영 체제나 다른 IIS 버전을 사용할 때 자주 발생합니다.저장 위치의 차이로 인해 reg-ex가 실패할 수 있습니다.저는 정규식 전문가가 아니기 때문에 귀하의 정규식에 오류가 포함되어 있는지 여부는 알 수 없지만 이것이 제가 생각할 수 있는 첫 번째 것입니다.

또한 DEV는 귀하의 컴퓨터입니까?이 경우:IIS를 사용하고 있습니까, 아니면 ASP.NET 개발 서버를 사용하고 있습니까?Visual Studio에 통합된 IIS와 ASP.NET 개발 서버는 특정 상황에서 다르게 동작하기 때문입니다.

또한:배열 위치로 직접 "점프"하는 것은 많은 개발자들에 의해 나쁜 습관으로 간주됩니다(또한 올바른 양의 항목이 있다고 가정하고 배열로 바로 점프하는 것도 좋지 않다고 생각합니다).특히 다차원 배열을 사용할 때 오류가 발생하면 까다로울 수 있습니다.나는 배열 인덱스에서 실패하는 많은 복잡한 코드를 보았고 검사가 없었기 때문에 디버깅하기가 매우 어려웠습니다(5 또는 6차원 배열에 대해 이야기하고 있습니다).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top