Размер загрузки файла jQuery [дубликат]

Что такое «неопределенный ссылочный / неразрешенный внешний символ»

Я попытаюсь объяснить, что такое «неопределенный ссылочный / неразрешенный внешний символ».

note : я использую g ++ и Linux, и все примеры для него

Например, у нас есть некоторый код

// src1.cpp
void print();

static int local_var_name; // 'static' makes variable not visible for other modules
int global_var_name = 123;

int main()
{
    print();
    return 0;
}

и

// src2.cpp
extern "C" int printf (const char*, ...);

extern int global_var_name;
//extern int local_var_name;

void print ()
{
    // printf("%d%d\n", global_var_name, local_var_name);
    printf("%d\n", global_var_name);
}

Создание объектных файлов

$ g++ -c src1.cpp -o src1.o
$ g++ -c src2.cpp -o src2.o

После фазы ассемблера у нас есть объектный файл, который содержит любые экспортируемые символы. Посмотрите на символы

$ readelf --symbols src1.o
  Num:    Value          Size Type    Bind   Vis      Ndx Name
     5: 0000000000000000     4 OBJECT  LOCAL  DEFAULT    4 _ZL14local_var_name # [1]
     9: 0000000000000000     4 OBJECT  GLOBAL DEFAULT    3 global_var_name     # [2]

Я отклонил некоторые строки из вывода, потому что они не имеют значения

Итак, мы видим следующие символы для экспорта.

[1] - this is our static (local) variable (important - Bind has a type "LOCAL")
[2] - this is our global variable

src2.cpp ничего не экспортирует, и мы не видели его символов

Свяжите наши объектные файлы

$ g++ src1.o src2.o -o prog

и запустите его

$ ./prog
123

Linker видит экспортированные символы и связывает их. Теперь мы пытаемся раскомментировать строки в src2.cpp, как здесь

// src2.cpp
extern "C" int printf (const char*, ...);

extern int global_var_name;
extern int local_var_name;

void print ()
{
    printf("%d%d\n", global_var_name, local_var_name);
}

, и перестроить объектный файл

$ g++ -c src2.cpp -o src2.o

OK (нет ошибок), потому что мы только строим объектный файл, связь еще не завершена. Попробуйте установить ссылку

$ g++ src1.o src2.o -o prog
src2.o: In function `print()':
src2.cpp:(.text+0x6): undefined reference to `local_var_name'
collect2: error: ld returned 1 exit status

Это произошло потому, что наше local_var_name статично, то есть оно не отображается для других модулей. Теперь глубже. Получить выход фазы перевода

$ g++ -S src1.cpp -o src1.s

// src1.s
look src1.s

    .file   "src1.cpp"
    .local  _ZL14local_var_name
    .comm   _ZL14local_var_name,4,4
    .globl  global_var_name
    .data
    .align 4
    .type   global_var_name, @object
    .size   global_var_name, 4
global_var_name:
    .long   123
    .text
    .globl  main
    .type   main, @function
main:
; assembler code, not interesting for us
.LFE0:
    .size   main, .-main
    .ident  "GCC: (Ubuntu 4.8.2-19ubuntu1) 4.8.2"
    .section    .note.GNU-stack,"",@progbits

Итак, мы видели, что для local_var_name нет метки, поэтому линкер не нашел его. Но мы хакеры :), и мы можем это исправить. Откройте src1.s в текстовом редакторе и измените

.local  _ZL14local_var_name
.comm   _ZL14local_var_name,4,4

на

    .globl  local_var_name
    .data
    .align 4
    .type   local_var_name, @object
    .size   local_var_name, 4
local_var_name:
    .long   456789

i.e. вам должно быть как ниже

    .file   "src1.cpp"
    .globl  local_var_name
    .data
    .align 4
    .type   local_var_name, @object
    .size   local_var_name, 4
local_var_name:
    .long   456789
    .globl  global_var_name
    .align 4
    .type   global_var_name, @object
    .size   global_var_name, 4
global_var_name:
    .long   123
    .text
    .globl  main
    .type   main, @function
main:
; ...

мы изменили видимость local_var_name и установили его значение в 456789. Попробуйте построить из него объектный файл

$ g++ -c src1.s -o src2.o

ok, см.

$ readelf --symbols src1.o
8: 0000000000000000     4 OBJECT  GLOBAL DEFAULT    3 local_var_name

В настоящее время local_var_name имеет привязку GLOBAL (LOCAL)

link

$ g++ src1.o src2.o -o prog

и запускает ее

$ ./prog 
123456789

ok, мы взломаем его:)

Итак, в результате - «неопределенная ссылка / неразрешенная внешняя ошибка символа» происходит, когда компоновщик не может найти глобальные символы в объектных файлах.

73
задан Yuck 12 October 2013 в 21:39
поделиться

12 ответов

<script type="text/javascript">
function AlertFilesize(){
    if(window.ActiveXObject){
        var fso = new ActiveXObject("Scripting.FileSystemObject");
        var filepath = document.getElementById('fileInput').value;
        var thefile = fso.getFile(filepath);
        var sizeinbytes = thefile.size;
    }else{
        var sizeinbytes = document.getElementById('fileInput').files[0].size;
    }

    var fSExt = new Array('Bytes', 'KB', 'MB', 'GB');
    fSize = sizeinbytes; i=0;while(fSize>900){fSize/=1024;i++;}

    alert((Math.round(fSize*100)/100)+' '+fSExt[i]);
}
</script>

<input id="fileInput" type="file" onchange="AlertFilesize();" />

Работа над IE и FF

16
ответ дан Behnam Bakhshi 25 August 2018 в 17:21
поделиться

Лучшее решение для всех браузеров;)

function GetFileSize(fileid) {
 try {
 var fileSize = 0;
 //for IE
 if(checkIE()) {//we could use this $.browser.msie but since it's depracted we'll use this function
 //before making an object of ActiveXObject, 
 //please make sure ActiveX is enabled in your IE browser
 var objFSO = new ActiveXObject("Scripting.FileSystemObject"); var filePath = $("#" + fileid)[0].value;
 var objFile = objFSO.getFile(filePath);
 var fileSize = objFile.size; //size in kb
 fileSize = fileSize / 1048576; //size in mb 
 }
 //for FF, Safari, Opeara and Others
 else {
 fileSize = $("#" + fileid)[0].files[0].size //size in kb
 fileSize = fileSize / 1048576; //size in mb 
 }
 alert("Uploaded File Size is" + fileSize + "MB");
 }
 catch (e) {
 alert("Error is :" + e);
 }
}

из http://www.dotnet-tricks.com/Tutorial/jquery/HHLN180712-Get-file-size-before -upload-using-jquery.html

UPDATE: мы будем использовать эту функцию, чтобы проверить, является ли это браузером IE или нет

function checkIE() {
    var ua = window.navigator.userAgent;
    var msie = ua.indexOf("MSIE ");

    if (msie > 0 || !!navigator.userAgent.match(/Trident.*rv\:11\./)){  
        // If Internet Explorer, return version number
        alert(parseInt(ua.substring(msie + 5, ua.indexOf(".", msie))));
    } else {
        // If another browser, return 0
        alert('otherbrowser');
    }

 return false;
}
5
ответ дан Ben Holland 25 August 2018 в 17:21
поделиться

Лично я бы сказал, что ответ Web World является лучшим сегодня, учитывая стандарты HTML. Если вам необходимо поддерживать IE & lt; 10, вам нужно будет использовать некоторую форму ActiveX. Я бы избегал рекомендаций, связанных с кодированием с Scripting.FileSystemObject, или для непосредственного создания ActiveX.

В этом случае я имел успех с использованием сторонних JS-библиотек, таких как plupload , которые могут быть настроены на использование элементов управления HTML5 или Flash / Silverlight для закрашивания браузеров, которые не поддерживать их. Plupload имеет API-интерфейс на стороне клиента для проверки размера файла, который работает в IE & lt; 10.

114
ответ дан Community 25 August 2018 в 17:21
поделиться

Вот простой пример получения размера файла перед загрузкой. Он использует jQuery для обнаружения всякий раз, когда содержимое добавляется или изменяется, но вы все равно можете получить files[0].size без использования jQuery.

$(document).ready(function() {
  $('#openFile').on('change', function(evt) {
    console.log(this.files[0].size);
  });
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<form action="upload.php" enctype="multipart/form-data" method="POST" id="uploadform">
  <input id="openFile" name="img" type="file" />
</form>

< blockquote>

Вот более полный пример: некоторое доказательство кода концепции для Drag and Drop файлов в FormData и загрузка через POST на сервер. Он включает в себя простую проверку размера файла.

11
ответ дан Gleb Kemarsky 25 August 2018 в 17:21
поделиться

У меня была такая же проблема, и, похоже, у нас не было точного решения. Надеюсь, это может помочь другим людям.

Потратьте время на изучение, я наконец нашел ответ. Это мой код, чтобы получить прикрепление файла с помощью jQuery:

var attach_id = "id_of_attachment_file";
var size = $('#'+attach_id)[0].files[0].size;
alert(size);

Это всего лишь пример кода для получения размера файла. Если вы хотите делать другие вещи, не стесняйтесь менять код, чтобы удовлетворить ваши потребности.

7
ответ дан Hoang Le 25 August 2018 в 17:21
поделиться

Вы можете использовать API файлов HTML5: http://www.html5rocks.com/en/tutorials/file/dndfiles/

Однако вы всегда должны иметь резервную копию для PHP (или любого другого используемого вами бэкэнд-языка) для старых браузеров.

0
ответ дан José P. Airosa 25 August 2018 в 17:21
поделиться

вам нужно выполнить запрос ajax HEAD, чтобы получить размер файла. с jquery это что-то вроде этого

  var req = $.ajax({
    type: "HEAD",
    url: yoururl,
    success: function () {
      alert("Size is " + request.getResponseHeader("Content-Length"));
    }
  });
1
ответ дан kasper Taeymans 25 August 2018 в 17:21
поделиться

Решение ucefkh работало лучше всего, но поскольку $ .browser устарел в jQuery 1.91, ему пришлось изменить использование navigator.userAgent:

function IsFileSizeOk(fileid) {
try {
    var fileSize = 0;
    //for IE
    if (navigator.userAgent.match(/msie/i)) {
        //before making an object of ActiveXObject, 
        //please make sure ActiveX is enabled in your IE browser
        var objFSO = new ActiveXObject("Scripting.FileSystemObject"); var filePath = $("#" + fileid)[0].value;
        var objFile = objFSO.getFile(filePath);
        var fileSize = objFile.size; //size in kb
        fileSize = fileSize / 1048576; //size in mb 
    }
        //for FF, Safari, Opeara and Others
    else {
        fileSize = $("#" + fileid)[0].files[0].size //size in kb
        fileSize = fileSize / 1048576; //size in mb 
    }
    return (fileSize < 2.0);
}
catch (e) {
    alert("Error is :" + e);
}
}
1
ответ дан Mike 25 August 2018 в 17:21
поделиться

Пожалуйста, не используйте ActiveX, так как есть вероятность, что в Internet Explorer появится страшное предупреждение и отпугнет ваших пользователей.

Если кто-то хочет реализовать эту проверку, они должны полагаться только на объект FileList , доступный в современных браузерах, и полагаться на стороне сервера проверяется только для старых браузеров ( прогрессивное улучшение ).

function getFileSize(fileInputElement){
    if (!fileInputElement.value ||
        typeof fileInputElement.files === 'undefined' ||
        typeof fileInputElement.files[0] === 'undefined' ||
        typeof fileInputElement.files[0].size !== 'number'
    ) {
        // File size is undefined.
        return undefined;
    }

    return fileInputElement.files[0].size;
}
0
ответ дан Nicolas Bouvrette 25 August 2018 в 17:21
поделиться

Вы можете использовать функцию PHP filesize. Во время загрузки с помощью ajax сначала проверьте размер файла, сделав запрос ajax-запрос на php-скрипт, который проверяет размер файла и возвращает значение.

0
ответ дан rechie 25 August 2018 в 17:21
поделиться

Браузеры с поддержкой HTML5 имеют свойство файлов для типа ввода. Это, конечно же, не будет работать в старых версиях IE.

var inpFiles = document.getElementById('#fileID');
for (var i = 0; i < inpFiles.files.length; ++i) {
    var size = inpFiles.files.item(i).size;
    alert("File Size : " + size);
}
2
ответ дан Sandeep G 25 August 2018 в 17:21
поделиться

$(document).ready(function() {
  $('#openFile').on('change', function(evt) {
    console.log(this.files[0].size);
  });
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<form action="upload.php" enctype="multipart/form-data" method="POST" id="uploadform">
  <input id="openFile" name="img" type="file" />
</form>

1
ответ дан Viraj Nalawade 25 August 2018 в 17:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: