2017-10-29 7 views
0

내가푸른 BlobStorage : 400 (요청 입력 중 하나가 범위를 벗어났습니다.)

<?xml version="1.0" encoding="utf-8"?> 
    <Error> 
    <Code>OutOfRangeInput</Code> 
    <Message>One of the request inputs is out of range. 
      RequestId:-------------------------- 
      Time:2017-10-29T07:13:37.4218874Z 
    </Message> 
    </Error> 

내가 여러 모양의 업로드하고 나는 다음과 같은 오류 응답을 얻을 내 푸른 저장 계정에 모양을 업로드 할 때 일부는 성공적으로 업로드되고 다른 일부는 업로드되지 않습니다. 오류를 던지는 것들은 큰 blob-name (약 100 자)을 가지므로 blob-names 크기로 인한 것일 수 있습니다. 그러나 https://blogs.msdn.microsoft.com/jmstall/2014/06/12/azure-storage-naming-rules/에 따르면 최대 BLOB 이름은 1024가 될 수 있으며 BLOB 이름은 그 한계보다 작습니다.

의 예 덩어리-name은 BLOB을 업로드 "36분의 65/aluminium_03_group67_product_02pCube1_product_02group2_product_02Flow000_Albedo.png"

코드 편집을 할 것이다.

업로드 할 코드는 자바 스크립트입니다. 파일을 여러 개의 청크로 분할하고 업로드하고 있습니다. 기본적으로 블록 ID의 최대 길이는 64 바이트 (참조 될 수

var blockId = "block-" + this.file.name + "-" + this.pad(this.blockIds.length, 6); 

: 여기에 파일 업로드

function AzureFileUpload(file, uploadUrl, successCallback, progressCallback, errorCallback){ 
    this.file = file; 
    this.uploadUrl = uploadUrl; 
    this.successCallback = successCallback; 
    this.progressCallback = progressCallback; 
    this.errorCallback = errorCallback; 
    this.reader = new FileReader(); 
    this.maxBlockSize = 256 * 1024; 
    this.blockIds = []; 
    this.totalBytesRemaining = this.file.size; 
    this.currentFilePointer = 0; 
    this.bytesUploaded = 0; 
    this.uploadFlag = true; 
    var self = this; 
    this.reader.onloadend = function(evt) { 
     if (evt.target.readyState == FileReader.DONE) { // DONE == 2 
      var uri = self.uploadUrl + '&comp=block&blockid=' + self.blockIds[self.blockIds.length - 1]; 
      var requestData = new Uint8Array(evt.target.result); 
      self.ReadBlock(); 
      if(self.uploadFlag){ 
       self.UploadBlock(requestData, uri); 
      } 
     } 
    }; 
    this.ReadBlock(); 
} 

AzureFileUpload.prototype.UploadBlock = function(requestData, blockUrl){ 
    var self = this; 
    $.ajax({ 
     url: blockUrl, 
     type: "PUT", 
     data: requestData, 
     processData: false, 
     beforeSend: function(xhr) { 
      xhr.setRequestHeader('x-ms-blob-type', 'BlockBlob'); 
      xhr.setRequestHeader('x-ms-blob-cache-control', "public, max-age=864000"); 
     }, 
     success: function(data, status) { 
      self.UpdateProgress(requestData.length); 
      self.bytesUploaded += requestData.length; 
      if (parseFloat(self.bytesUploaded) == parseFloat(self.file.size)) { 
       self.CommitBlocks(); 
      } 
     }, 
     error: function(xhr, desc, err) { 
      // console.log(desc); 
      // console.log(err); 
      self.Error("Unexpected error occured while uploading model. Plaese try after some time"); 
     } 
    }); 
}; 

AzureFileUpload.prototype.pad = function(number, length){ 
    var str = '' + number; 
    while (str.length < length) { 
     str = '0' + str; 
    } 
    return str; 
}; 

AzureFileUpload.prototype.ReadBlock = function(){ 
    if (this.totalBytesRemaining > 0) { 
     var fileContent = this.file.slice(this.currentFilePointer, this.currentFilePointer + this.maxBlockSize); 
     var blockId = "block-" + this.file.name + "-" + this.pad(this.blockIds.length, 6); 
     this.blockIds.push(btoa(blockId)); 
     this.reader.readAsArrayBuffer(fileContent); 
     this.currentFilePointer += this.maxBlockSize; 
     this.totalBytesRemaining -= this.maxBlockSize; 
     if (this.totalBytesRemaining < this.maxBlockSize) { 
      this.maxBlockSize = this.totalBytesRemaining; 
     } 
    } 
}; 

AzureFileUpload.prototype.UpdateProgress = function(bytesUploaded){ 
    console.log("Progress",bytesUploaded); 
    if(this.progressCallback){ 
     this.progressCallback(bytesUploaded); 
    } 
}; 

AzureFileUpload.prototype.CommitBlocks = function(){ 
    var self = this; 
    var uri = this.uploadUrl + '&comp=blocklist'; 
    var request = '<?xml version="1.0" encoding="utf-8"?><BlockList>'; 
    for (var i = 0; i < this.blockIds.length; i++) { 
     request += '<Latest>' + this.blockIds[i] + '</Latest>'; 
    } 
    request += '</BlockList>'; 
    $.ajax({ 
     url: uri, 
     type: "PUT", 
     data: request, 
     beforeSend: function(xhr) { 
      xhr.setRequestHeader('x-ms-blob-content-type', self.file.type); 
      xhr.setRequestHeader('x-ms-blob-cache-control', "public, max-age=864000"); 
     }, 
     success: function(data, status) { 
      console.log("Block Commited", data); 
      if(self.successCallback){ 
       self.successCallback(); 
      } 
     }, 
     error: function(xhr, desc, err) { 
      self.Error("Unexpected error occured while uploading model. Plaese try after some time"); 
     } 
    }); 
}; 

AzureFileUpload.prototype.Error = function(msg){ 
    this.CancelUpload(); 
    if(this.errorCallback){ 
     this.errorCallback(msg); 
    } 
}; 

AzureFileUpload.prototype.CancelUpload = function(){ 
    this.uploadFlag = false; 
}; 
+0

얼룩 업로드 용 코드를 공유하십시오. –

+0

@GauravMantri가 코드를 포함하도록 질문을 편집했습니다. – shubham003

답변

1

문제는 다음 코드 줄 함께 책임이있는 기능입니다 https://docs.microsoft.com/en-us/rest/api/storageservices/put-block이 - 참조 URI 매개 변수 섹션). 블록 ID 계산에 파일 이름을 포함하고 파일 이름이 크기 때문에이 제한을 초과합니다.

는 다음의 코드로 시도하십시오 당신은이 오류를 얻을 안 : 당신이 블롭 이름을 포함하는 것이 정말 필요가 없습니다 있도록

var blockId = "block-" + this.pad(this.blockIds.length, 6); 

블록 식별자가 덩어리로 범위 참고하세요 블롭에 고유 한 블럭 ID를 만들기 위해서.

+0

고마워요. – shubham003