2011-12-29 17 views
5

Tengo un problema al intentar subir un archivo directamente al almacenamiento de blobs azul. Estoy usando ajax calls para enviar solicitudes de publicación a un manejador de ashx para cargar un blob en fragmentos. El problema al que me estoy enfrentando es que el controlador no está recibiendo el archivochunk enviado desde la publicación de ajax.Cargando en Azure

puedo ver la página está recibiendo el mensaje correcto de mirar a la solicitud de Firebug,

---------------------- ------- 265001916915724 Content-Disposition: form-data; > name = "Slice"; filename = "blob" Content-Type: application/octet-stream

Me di cuenta de que el flujo de entrada en el controlador tiene el archivo, incluidos bytes adicionales de la solicitud. Intenté leer solo el tamaño del filechunk desde inputstream, sin embargo, esto resultó en un archivo corrupto.

Me inspiré en http://code.msdn.microsoft.com/windowsazure/Silverlight-Azure-Blob-3b773e26, simplemente lo convertí de MVC3 a usar el estándar aspx.

Aquí es la llamada usando ajax para enviar el trozo archivo a la página aspx,

var sendFile = function (blockLength) { 
var start = 0, 
    end = Math.min(blockLength, uploader.file.size), 
    incrimentalIdentifier = 1, 
    retryCount = 0, 
    sendNextChunk, fileChunk; 
uploader.displayStatusMessage(); 
sendNextChunk = function() { 
    fileChunk = new FormData(); 
    uploader.renderProgress(incrimentalIdentifier); 
    if (uploader.file.slice) { 
     fileChunk.append('Slice', uploader.file.slice(start, end)); 
    } 
    else if (uploader.file.webkitSlice) { 
     fileChunk.append('Slice', uploader.file.webkitSlice(start, end)); 
    } 
    else if (uploader.file.mozSlice) { 
     fileChunk.append('Slice', uploader.file.mozSlice(start, end)); 
    } 
    else { 
     uploader.displayLabel(operationType.UNSUPPORTED_BROWSER); 
     return; 
    } 
    var testcode = 'http://localhost:56307/handler1.ashx?create=0&blockid=' + incrimentalIdentifier + '&filename=' + uploader.file.name + '&totalBlocks=' + uploader.totalBlocks; 
    jqxhr = $.ajax({ 
     async: true,   
     url: testcode, 
     data: fileChunk, 
     contentType: false, 
     processData:false, 
     dataType: 'text json',   
     type: 'POST', 
     error: function (request, error) { 
      if (error !== 'abort' && retryCount < maxRetries) { 
       ++retryCount; 
       setTimeout(sendNextChunk, retryAfterSeconds * 1000); 
      } 

      if (error === 'abort') { 
       uploader.displayLabel(operationType.CANCELLED); 
       uploader.resetControls(); 
       uploader = null; 
      } 
      else { 
       if (retryCount === maxRetries) { 
        uploader.uploadError(request.responseText); 
        uploader.resetControls(); 
        uploader = null; 
       } 
       else { 
        uploader.displayLabel(operationType.RESUME_UPLOAD); 
       } 
      } 

      return; 
     }, 
     success: function (notice) { 
      if (notice.error || notice.isLastBlock) { 
       uploader.renderProgress(uploader.totalBlocks + 1); 
       uploader.displayStatusMessage(notice.message); 
       uploader.resetControls(); 
       uploader = null; 
       return; 
      } 

      ++incrimentalIdentifier; 
      start = (incrimentalIdentifier - 1) * blockLength; 
      end = Math.min(incrimentalIdentifier * blockLength, uploader.file.size); 
      retryCount = 0; 
      sendNextChunk(); 
     } 
    }); 
}; 

Muchas gracias por todo lo que me puede ayudar a cabo.

Respuesta

0

Aparece en mi formulario web, a la etiqueta del archivo de entrada le faltaba el atributo enctype = "multipart/form-data".

0

¿es ASPX a propósito? en http://localhost:56307/handler1. ashx? Create = 0 & blockid?

+0

No a propósito, he intentado usar un controlador genérico en lugar de la página aspx, pero ambas opciones aún no pueden leer el archivochunk que se envía, Request.Files todavía está vacío. – Zephon