мне нужно загрузить файл в Chrome и нужно ** опубликовать ** несколько параметров по тому же запросу - PullRequest
2 голосов
/ 19 июля 2010

Мне нужно загрузить файл в Chrome, и нужно отправить некоторые параметры в одном запросе, и нужна базовая аутентификация.Я хочу использовать JavaScript AJAX, чтобы сделать это.но Chrome не поддерживает sendAsBinary, как я могу это сделать?

function sendMsg(status){

    var user = localStorage.getObject(CURRENT_USER_KEY);
    var file = $("#imageFile")[0].files[0];

    var boundary = '----multipartformboundary' + (new Date).getTime();
    var dashdash = '--';
    var crlf     = '\r\n';

    /* Build RFC2388 string. */
    var builder = '';

    builder += dashdash;
    builder += boundary;
    builder += crlf;

    var xhr = new XMLHttpRequest();
    var upload = xhr.upload;
    xhr.onreadystatechange = function(){
        if(xhr.readyState==4){
            //
        }
    };

  if(upload){
        upload.onprogress = function(ev){
            onprogress(ev);
        };
    }

    /* Generate headers. [STATUS] */            
    builder += 'Content-Disposition: form-data; name="status"';
    builder += crlf;
    builder += crlf; 

    /* Append form data. */
    builder += msg;
    builder += crlf;

    /* Write boundary. */
    builder += dashdash;
    builder += boundary;
    builder += crlf;

    /* Generate headers. [PIC] */            
    builder += 'Content-Disposition: form-data; name="pic"';
    if (file.fileName) {
      builder += '; filename="' + file.fileName + '"';
    }
    builder += crlf;

    builder += 'Content-Type: '+file.type;
    builder += crlf;
    builder += crlf; 

    /* Append binary data. */
    builder += file.getAsBinary(); //chrome do not support getAsBinary()
    builder += crlf;

    /* Write boundary. */
    builder += dashdash;
    builder += boundary;
    builder += crlf;

    /* Mark end of the request. */
    builder += dashdash;
    builder += boundary;
    builder += dashdash;
    builder += crlf;

    xhr.open("POST", apiUrl.sina.upload, true);
    xhr.setRequestHeader('content-type', 'multipart/form-data; boundary=' + boundary);
    xhr.setRequestHeader('Authorization', make_base_auth_header(user.userName, user.password));
    xhr.sendAsBinary(builder); //chrome do not support sendAsBinary()

    xhr.onload = function(event) { 
        /* If we got an error display it. */
        if (xhr.responseText) {
            console.log(xhr.responseText);
        }
    };
};

Ответы [ 3 ]

0 голосов
/ 26 мая 2011

Используйте xhr.send(FormData).Вам не нужно создавать multipart-form-data самостоятельно :) См. Мой ответ здесь:

API файлов Javascript / HTML5, считывающий последовательные файлы в данные из нескольких частей

0 голосов

builder + = file.getAsBinary (); // chrome не поддерживает getAsBinary ()

Используйте метод readAsBinaryString API FileReader. Chrome поддерживает это.

xhr.sendAsBinary (строитель); // Chrome Do не поддерживает sendAsBinary ()

Узнайте, как это сделать, по следующим адресам:

http://javascript0.org/wiki/Portable_sendAsBinary

http://code.google.com/p/chromium/issues/detail?id=35705

0 голосов
/ 19 июля 2010

Используйте форму для отправки запроса на загрузку файла, как обычно, но установите целевой объект в виде скрытого фрейма.Это не обновит страницу, но все равно загрузит файл.Вы также можете заставить сервер выплевывать некоторый код JavaScript, который после загрузки в скрытый iframe сообщит вам, когда файл будет загружен.Вот форма:

<iframe name=UploadTarget style="visibility: hidden;"></iframe>
<form method=post target=MyHiddenIframe action="Upload.php" enctype="multipart/form-data">
  <input type=file name=File1>
  <input type=button value="Upload">
</form>

Чтобы опубликовать некоторые дополнительные параметры, я обнаружил, что проще всего добавить их в строку действия формы:

Upload.php?MyVar1=value1&MyVar2=value2

Насколько я знаю, естьнет способа прочитать данные формы и данные файла в одном запросе, но вы можете прочитать информацию, отправленную через URL.

...