C : \ fakepath를 해결하는 방법?


256
<input type="file" id="file-id" name="file_name" onchange="theimage();">

이것은 내 업로드 버튼입니다.

<input type="text" name="file_path" id="file-path">

이것은 파일의 전체 경로를 표시 해야하는 텍스트 필드입니다.

function theimage(){
 var filename = document.getElementById('file-id').value;
 document.getElementById('file-path').value = filename;
 alert(filename);
}

이것은 내 문제를 해결하는 JavaScript입니다. 그러나 경고 값에서

C:\fakepath\test.csv 

그리고 Mozilla는 나에게 다음을 제공합니다.

test.csv

그러나 로컬 정규 파일 경로를 원합니다 . 이 문제를 해결하는 방법?

이것이 브라우저 보안 문제로 인한 것이라면 이것을 대체하는 방법은 무엇입니까?


41
이것은 브라우저의 보안 구현입니다. 브라우저는 디스크 구조에 액세스하지 못하도록 보호합니다. 전체 경로를 원하는 이유를 설명 할 수 있으면 도움이 될 수 있습니다.
스튜어트

1
전체 URL 이란 무엇입니까 ? 업로드 된 파일의 주소?
gor

4
레코드의 경우 IE는 "예상"경로를 "중단"하는 서버를 원하지 않기 때문에 "fakepath"비트 만 제공합니다. 그렇지 않으면 보안상의 이유로 다른 브라우저와 마찬가지로 파일 이름 만 가져옵니다 (경로 없음). 더 중요한 것은 악의적 인 의도가 없다면 경로를 아는 것이 왜 유용한 지 알 수없는 이유입니다.
scunliffe

2
browser security issue~ 브라우저에서 구현 된 경우 (정확하게) 우회 할 가능성은 거의 없습니다
Ross

13
어머니, 내 모든 파일을에 보관 C:\fakepath하므로 이제 모든 사람이 내 디렉토리 구조를 알고 있습니다.
mbomb007

답변:


173

일부 브라우저에는 JavaScript가 파일의 로컬 전체 경로를 알지 못하게하는 보안 기능이 있습니다. 클라이언트로서 서버가 로컬 시스템의 파일 시스템을 알기를 원하지 않습니다. 모든 브라우저에서이 작업을 수행하면 좋을 것입니다.


9
브라우저가 로컬 파일 경로를 보내지 않으면 찾을 수 없습니다.
Petteri Hietavirta

47
양식을 게시하면 브라우저가 업로드를 처리합니다. 웹 사이트는 클라이언트의 전체 경로를 알 필요가 없습니다.
Rup

2
@ruffp 게시물로만 업로드 할 수 있으므로 업로드를 양식에 넣고 제출해야합니다. 여전히 표준 파일 업로드 컨트롤을 사용하여 파일을 선택하므로 여전히 전체 클라이언트 파일 이름이 필요하지 않습니다.
Rup December

6
일반 웹 사이트가 플래시 또는 Java와 같은 신뢰할 수있는 플러그인없이 로컬 컴퓨터에 악의적 인 일이 있는지 의심합니다. 사생활 보호에 더 가깝습니다. 예를 들어, 바탕 화면에서 당신이있는 거 업로드하는 경우, 서버가 로컬 컴퓨터 또는 도메인 (에서 사용자 이름을 알려주는 거라고 c:\users\myname\desktop/Users/myname/Desktop/또는 무엇이든). 그것은 웹 서버가 사업에 대해 알고있는 것이 아닙니다.
Joe Enos 2016 년

8
정보는 누군가에 대해 정보를 사용할 수 있으므로 거의 항상 보안 및 취약성과 관련이 있습니다. 공격은 종종 여러 가지 문제를 악용하여 목표를 달성합니다. 위험을 인식하지 못하는 사람은 추가 편집 방법 워크숍없이 Hello World 이외의 코드 근처에서 허용해서는 안됩니다.
Archimedix

70

사용하다

document.getElementById("file-id").files[0].name; 

대신에

document.getElementById('file-id').value

16
Chrome 44.0.2403.125에서는 파일 이름 만 제공합니다.
간격

4
그런 다음 document.getElementById ( "file-id"). files [0] .path를 사용하십시오. 나를 위해 잘 작동합니다.
Loaderon

감사합니다 @Loaderon 당신은 이것을 답변으로 게시해야합니다!
7geeky

45

onchange입력 파일 유형 의 입력 이벤트에서 FileReader 객체를 사용합니다 ! 이 예제는 readAsDataURL 함수를 사용하므로 태그가 있어야합니다. FileReader 객체에는 이진 데이터를 가져 오는 readAsBinaryString도 있습니다.이 데이터는 나중에 서버에서 동일한 파일을 만드는 데 사용할 수 있습니다.

예:

var input = document.getElementById("inputFile");
var fReader = new FileReader();
fReader.readAsDataURL(input.files[0]);
fReader.onloadend = function(event){
    var img = document.getElementById("yourImgTag");
    img.src = event.target.result;
}

왜 이것이 로컬 호스트에서 작동하지 않는지 알고 있습니까? 소스는 다음과 같이 설정됩니다 = "C : \ fakepath \ filename.jpg"SRC 하지만 이미지 요소를 console.logging하면 SRC가 dataURL 말한다
galki

답 : 백본 다시 렌더링 : /
galki

1
이 항목이 얼마나 많은 좌절을했는지 모릅니다. 그것은 대략 12 업 투표이지만 더 많은 가치가있는 거친 다이아몬드입니다. 훨씬 높은 투표율을 가진 다른 항목이 작동하지 않고 FormData ()가 우리의 목적을 위해 속임수를 쓰지 않기 때문에 더 자세히 살펴 봤습니다. 잘 했어!
user1585204

9
질문은 파일 내용이 아닌 파일 경로를 묻는 것입니다 .
Quentin

@Quentin : 그렇습니다.하지만 OP의 의도는 어떻게 든 파일을 서버에 업로드 할 수 있다는 것입니다. 따라서이 솔루션은 JS를 사용하여 서버에 파일을 업로드하는 방법을 찾는 모든 사람들에게 매우 도움이 될 것입니다.
user18490

36

Internet Explorer, 도구, 인터넷 옵션, 보안, 사용자 정의로 이동 한 경우 "파일을 서버에 업로드 할 때 로컬 디렉토리 경로 포함"을 찾아 "다운"방법을 클릭하십시오. 이 작동합니다


2
Chrome과 비슷한 것이 있습니까?
Zaven Zareyan

11

브라우저가 방해가되는 스크립트 등으로부터 우리를 구해 주어야한다는 것이 기쁘다. IE가 간단한 스타일 수정을 해킹 공격처럼 보이게하는 브라우저에 무언가를 넣는 것에 만족하지 않습니다!

<span>을 사용하여 파일 입력을 나타내므로 <input> 대신 <div>에 적절한 스타일을 적용 할 수 있습니다 (IE로 인해 다시 한 번). 이제는이 IE로 인해 사용자에게 가드와 최소한의 불안감을 줄 수있는 값을 가진 경로를 보여주고 자합니다.

어쨌든, 여기에 설명을 게시 한 사람들 덕분에 IE 브라우저 보안 : input [type = "file"]의 파일 경로에 "fakepath"를 추가 하여 사소한 해결사-상단을 정리했습니다 ...

아래 코드는 두 가지 작업을 수행합니다. 업로드 필드의 onBlur까지 onChange 이벤트가 시작되지 않고 사용자를 놀라게하지 않는 정리 된 파일 경로로 요소를 업데이트하는 IE8 버그를 수정합니다.

// self-calling lambda to for jQuery shorthand "$" namespace
(function($){
    // document onReady wrapper
    $().ready(function(){
        // check for the nefarious IE
        if($.browser.msie) {
            // capture the file input fields
            var fileInput = $('input[type="file"]');
            // add presentational <span> tags "underneath" all file input fields for styling
            fileInput.after(
                $(document.createElement('span')).addClass('file-underlay')
            );
            // bind onClick to get the file-path and update the style <div>
            fileInput.click(function(){
                // need to capture $(this) because setTimeout() is on the
                // Window keyword 'this' changes context in it
                var fileContext = $(this);
                // capture the timer as well as set setTimeout()
                // we use setTimeout() because IE pauses timers when a file dialog opens
                // in this manner we give ourselves a "pseudo-onChange" handler
                var ieBugTimeout = setTimeout(function(){
                    // set vars
                    var filePath     = fileContext.val(),
                        fileUnderlay = fileContext.siblings('.file-underlay');
                    // check for IE's lovely security speil
                    if(filePath.match(/fakepath/)) {
                        // update the file-path text using case-insensitive regex
                        filePath = filePath.replace(/C:\\fakepath\\/i, '');
                    }
                    // update the text in the file-underlay <span>
                    fileUnderlay.text(filePath);
                    // clear the timer var
                    clearTimeout(ieBugTimeout);
                }, 10);
            });
        }
    });
})(jQuery);

IE에서는 작동하지 않습니다. 다음을 대체했습니다. filePath.substring (filePath.lastIndexOf ( '\\') + 1, filePath.length)
Bassel Kh

6

나는 같은 문제에 직면했다. IE8에서는 파일 입력 제어 후에 숨겨진 입력을 작성하여 해결할 수 있습니다. 이것을 이전 형제의 값으로 채 웁니다. IE9에서는이 문제가 수정되었습니다.

전체 경로를 알고 싶은 이유는 업로드하기 전에 자바 스크립트 이미지 미리보기를 만드는 것이 었습니다. 이제 선택한 이미지의 미리보기를 만들려면 파일을 업로드해야합니다.


1
누군가 업로드하기 전에 이미지를 보려면 컴퓨터에서 이미지를 볼 수 있습니다.
mbomb007

4

uploded 파일의 전체 경로를 실제로 보내야하는 경우 브라우저가 보내지 않으면이 정보를 얻을 수있는 방법이 없으므로 서명 된 Java 애플릿과 같은 것을 사용해야합니다.


원래 경로를 전체 경로로 지정하는 방법 <input type = "file"accept = ". jpeg, .jpg, .png">. i 가짜 경로를 얻는 방법, 경로를 다시 지정하는 방법
Govind Sharma


1

파일 리더를 사용하십시오.

$(document).ready(function() {
        $("#input-file").change(function() {
            var length = this.files.length;
            if (!length) {
                return false;
            }
            useImage(this);
        });
    });

    // Creating the function
    function useImage(img) {
        var file = img.files[0];
        var imagefile = file.type;
        var match = ["image/jpeg", "image/png", "image/jpg"];
        if (!((imagefile == match[0]) || (imagefile == match[1]) || (imagefile == match[2]))) {
            alert("Invalid File Extension");
        } else {
            var reader = new FileReader();
            reader.onload = imageIsLoaded;
            reader.readAsDataURL(img.files[0]);
        }

        function imageIsLoaded(e) {
            $('div.withBckImage').css({ 'background-image': "url(" + e.target.result + ")" });

        }
    }

-1

내 경우에는 asp.net 개발 환경을 사용하고 있으므로 asynchronus ajax 요청으로 해당 데이터를 업로드하고 싶었습니다. [webMethod]에서 정적 요소가 아니기 때문에 파일 업 로더를 잡을 수 없으므로 원하는 이미지를 바이트로 변환하여 DB에 저장하는 것보다 경로를 수정하여 이러한 솔루션을 전환하십시오.

여기 내 자바 스크립트 함수가 도움이되기를 바랍니다.

function FixPath(Path)
         {
             var HiddenPath = Path.toString();
             alert(HiddenPath.indexOf("FakePath"));

             if (HiddenPath.indexOf("FakePath") > 1)
             {
                 var UnwantedLength = HiddenPath.indexOf("FakePath") + 7;
                 MainStringLength = HiddenPath.length - UnwantedLength;
                 var thisArray =[];
                 var i = 0;
                 var FinalString= "";
                 while (i < MainStringLength)
                 {
                     thisArray[i] = HiddenPath[UnwantedLength + i + 1];
                     i++;
                 }
                 var j = 0;
                 while (j < MainStringLength-1)
                 {
                     if (thisArray[j] != ",")
                     {
                         FinalString += thisArray[j];
                     }
                     j++;
                 }
                 FinalString = "~" + FinalString;
                 alert(FinalString);
                 return FinalString;
             }
             else
             {
                 return HiddenPath;
             }
         }

테스트 목적으로 만 여기에 :

 $(document).ready(function () {
             FixPath("hakounaMatata:/7ekmaTa3mahaLaziz/FakePath/EnsaLmadiLiYghiz");
         });
// this will give you : ~/EnsaLmadiLiYghiz

-3

Sardesh Sharma의 답변 사용 보완 :

document.getElementById("file-id").files[0].path

전체 경로.


이것은 undefinedFireFox 75.0에서 나에게 돌아갑니다 . 않습니다 path실제로 존재? 그것에 관한 문서에 대한 언급이 있습니까?
호세 마누엘 아 바르카 로드리게스

1
안녕하세요! 문제를 직접 해결하고 경로를 사용하여 성공한 후에이 답변을 게시했습니다. 내가 시도한 프로젝트는 기억 나지 않지만 항상 Chrome을 사용합니다.이 솔루션은 해당 브라우저에만 적합합니다. 브라우저 업데이트로 인해 더 이상 사용되지 않을 수도 있습니다. 더 이상 도와 드릴 수 없어 죄송합니다 : /
Loaderon
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.