代码之家  ›  专栏  ›  技术社区  ›  lilHar

通过前端javascript列出服务器上的文件

  •  0
  • lilHar  · 技术社区  · 7 年前

    / (Web Root)
    |__ /Build_a_card
    |__ /Cool pictures
      |__ /Summer Pictures
           summer_dog.gif
           smiling_sun.svg
      |__ /Winter Pictures
           snowman.png
      cat.jpg
    

    然后在javascript中

    var image_list = get_list("/Cool Pictures");
    build_select_list(image_list);
    
    function get_list(folder_to_look_in){
       var the_list = ???
       return the_list;
    }
    ...
    

    <select>
      <option value="summer_pictures/summer_dog.gif">summer_dog.gif</option>
      <option value="summer_pictures/smiling_sun.svg">smiling_sun.svg</option>
      <option value="winter_pictures/snowman.png">snowman.png</option>
      <option value="cat.jpg">cat.jpg</option>
    </select>
    

    在一个疯狂的世界里,由于文件夹中的各个文件都可以被javascript访问,所以假设我可以强制执行文件夹中每个可能的文件名,并在每个文件上返回成功:

    function get_list(folder){
      var list_of_files = {};
      var starting_character = 0;
         list_of_files = every_single_option({starting_character}, 0, 40, folder)
      }
    }
    function every_single_option(existing_characters, current_depth, max_depth, folder){
      this_string = String.fromCharCode(existing_characters);
      if (request_url(this_string, folder)){
         there_array[this_string] = this_string;
      }
      var there_array = {}
      var i;
      if (current_depth < max_depth){
        while (i < 127){
            let temp_array = there_array;
            temp_array[i] = i;
            mix_source(there_array, every_single_option(existing_characters, current_depth + 1, max_depth, folder))
        }
    }
    return there_array;
    }
    function request_url(url, folder){
      var oReq = new XMLHttpRequest();
      oReq.addEventListener("load", reqListener);
      oReq.open("GET", "/" + folder + "/" + url);
      oReq.send();
    }
    function mix(source, target) {
       for(var key in source) {
         if (source.hasOwnProperty(key)) {
            target[key] = source[key];
         }
       }
    }
    

    那样做太疯狂了 (无论是可笑的缓慢还是非常糟糕的代码设计,诉诸暴力强迫自己的网站都是愚蠢的。)

    (如果您坚持要发布jquery方法来实现这一点,请同时发布非jquery方法,因为我的环境中没有可用的jquery。)

    0 回复  |  直到 7 年前
        1
  •  2
  •   lilHar    7 年前

    所以,拒绝承认这是不可能的,我设计了一个解决方案,工作,不需要API。 积极 阻止javascript查看目录。换句话说,服务器没有关闭索引,目录也没有index.html或等效文件来重写任何索引尝试,服务器也没有进行一些url重写。换句话说,这应该适用于任何不重写或阻止索引的服务器环境。

    这里有一个草稿(仍然是小车,需要完成):

    var request = new XMLHttpRequest();
    request.open('GET', '/my/directory/', true);
    
    request.onload = function() {
      if (request.status >= 200 && request.status < 400) {
        // Success!
        var resp = request.responseText;
      }
    };
    
    request.send();
    var directory_listing = resp;
    var regexp = /\b((?:[a-z][\w-]+:(?:\/{1,3}|[a-z0-9%])|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'".,<>?«»“”‘’]))/i;
    var match, files = [];
    
    while ((match = regexp.exec(resp)) != null) {
      files.push(match.index);
    }
    
    console.log(files);
    
        2
  •  0
  •   Quentin    7 年前

    不。 这也不是一种不体面的方式。

    前端可以通过HTTP或WebSockets与服务器进行通信。

    这两种方法都没有为探索文件系统提供任何内置机制。

    您需要服务器提供一个API(例如web服务),该API提供您想要的信息。