2013-07-02 1 views
3

HTML5/Javascript를 사용하여 파일을 BLOB 저장소에 직접 업로드하기 위해 Gaurav Mantri의 훌륭한 기사를 따랐습니다. JavaScript를 사용하여 blob 저장소에 파일을 저장하면 403 (서버가 요청을 인증하지 못했습니다.)

http://gauravmantri.com/2013/02/16/uploading-large-files-in-windows-azure-blob-storage-using-shared-access-signature-html-and-javascript/

그러나 나는 업로드 부분에서 자신이 코드 부분이 403 오류와 함께 실패 것을 발견하고있다.

재미있는 점은 임의로 발생한다는 것입니다. 업로드가 실제로 작동하고 모든 것이 성공적으로 완료되지만 대다수의 경우 403 오류로 인해 실패합니다.

한 가지 참고 : 나는 CORS 지원 내가 크롬을 사용하고있는 그러나 시간이 푸른 곧 추가 될 것으로 기대하고있다합니다 (chrome.exe의 --disable-웹 보안 옵션) 얻을 수 있습니다 문제를 둘러싼.

PUT https://mystorage.blob.core.windows.net/asset-38569007-3316-4350 ... Giv17ye4bocVWDbA/EQ + riNiG3wEGrFucbd1BKI9E = & 완 = 블록 & BLOCKID = YmxvY2stMA ==

403 (서버가 요청을 인증하는 데 실패했다. 확실 인증 헤더의 값이 제대로 형성되었는지 확인 서명을 포함.)

$.ajax({ 
    url: uri, 
    type: "PUT", 
    data: requestData, 
    processData: false, 
    beforeSend: function(xhr) { 
     xhr.setRequestHeader('x-ms-blob-type', 'BlockBlob'); 
     xhr.setRequestHeader('Content-Length', requestData.length); 
    }, 
    success: function (data, status) { 
     console.log(data); 
     console.log(status); 
     bytesUploaded += requestData.length; 
     var percentComplete = ((parseFloat(bytesUploaded)/parseFloat(selectedFile.size)) * 100).toFixed(2); 
     $("#fileUploadProgress").text(percentComplete + " %"); 
     uploadFileInBlocks(); 
    }, 
    error: function(xhr, desc, err) { 
     console.log(desc); 
     console.log(err); 
    } 
}); 

나는 ASSE을 만든 후 30 초 지연을 뒀다 locator가 전파 될 시간을주기 위해 실제로 업로드 부분을 시작하기 전에 Azure의 t/locator/file을 사용하십시오.

내가 누락 될 수있는 것에 대한 제안 사항이 있으십니까?

+1

공유 액세스 서명이 만료되지 않도록 할 수 있습니까? 대체 테스트로 SAS 및 .NET SDK를 사용하여 파일을 업로드 할 수도 있습니다. Fiddler를 실행하여 스토리지 서비스에서 반환 된 상세한 메시지를 볼 수도 있습니다. CORS에 관한 한 꽤 빨리 다가오고 있습니다. 지난주 // Build/conference 중에 발표 및 시연되었습니다. –

+0

Gaurav, 나는 Build에서 // CORS를 고대하고 있었지만, 그동안 희망적으로이 문제를 해결할 수 있습니다. 아래에서 자산/위치/정책 생성 코드를 제공했습니다. .NET SDK를 사용하여 동일한 스타일의 코드를 사용하여 파일을 업로드 할 때 아무런 문제가 없으므로 문제가 무엇인지 잘 모릅니다. – Gautam

답변

0

Gaurav는 여기에 내가 빈 자산을 만드는 데 사용하는 코드입니다 (/ 로케이터 및 파일 w) : 문제의 방향으로 날을 가리키는위한 Gaurav에

/// <summary> 
/// Creates an empty asset on Azure and prepares it to upload 
/// </summary> 
public FileModel Create(FileModel file) 
{ 
    // Update the file model with file and asset id 
    file.FileId = Guid.NewGuid().ToString(); 

    // Create the new asset 
    var createdAsset = this.Context.Assets.Create(file.AssetName.ToString(), AssetCreationOptions.None); 

    // Create the file inside the asset and set its size 
    var createdFile = createdAsset.AssetFiles.Create(file.Filename); 
    createdFile.ContentFileSize = file.Size; 

    // Create a policy to allow uploading to this asset 
    var writePolicy = this.Context.AccessPolicies.Create("Policy For Copying", TimeSpan.FromDays(365 * 10), AccessPermissions.Read | AccessPermissions.Write | AccessPermissions.List); 

    // Get the upload locator 
    var destinationLocator = this.Context.Locators.CreateSasLocator(createdAsset, writePolicy); 

    // Get the SAS Uri and save it to file 
    var uri = new UriBuilder(new Uri(destinationLocator.Path)); 
    uri.Path += "/" + file.Filename; 
    file.UploadUri = uri.Uri; 

    // Return the updated file 
    return file; 
} 
2

많은 감사합니다.

자산/로케이터/정책을 생성 한 다음 JSON 호출을 생성 한 다음 다시 업로드 uri를 반환하는 것으로 나타났습니다.

그러나 내 업로드 URI는 Uri이고 JSON을 직렬화하면 제대로 인코딩되지 않았습니다. 문자열에 (서버) 내 URI 객체를 변경 한 후

(. 그리고 uploaduri = (새 UriBuilder를 호출 (theuri)) ToString();)는 웹 클라이언트가 제대로 인코딩 된에 URI는 다시 반환 나는 더 이상 403 오류를 가지고 있지 않습니다.

그래서 다른 사람들에게이 같은 문제가 발생하면 업로드 uri의 인코딩을 살펴볼 수 있습니다.