2013-08-22 21 views
8

Chúng tôi đang sử dụng mã này để tạo ra các yêu cầu và đặt tên tập tin để tải về:Làm thế nào để sử dụng các ký tự unicode trong tiêu đề phản hồi-content-phân phối của S3?

var request = new GetPreSignedUrlRequest() 
    .WithBucketName(S3BucketName) 
    .WithExpires(requestExpirationTime) 
    .WithKey(file.S3Key) 
    .WithResponseHeaderOverrides(
     new ResponseHeaderOverrides() 
      .WithContentDisposition("attachment; filename=\"Unicode FileName ᗩ Test.txt\"")); 

này tạo liên kết sau:

/s3path?AWSAccessKeyId=xxxx&Expires=1377199946&response-content-disposition=attachment%3B%20filename%3D"Unicode%20FileName%20ᗩ%20Test.txt"&Signature=xxxxx 

Mà cho lỗi này:

<Error> 
    <Code>InvalidArgument</Code> 
    <Message> 
     Header value cannot be represented using ISO-8859-1. 
    </Message> 
    <ArgumentValue>attachment; filename="Unicode ᗩ filename.txt"</ArgumentValue> 
    <ArgumentName>response-content-disposition</ArgumentName> 
    <RequestId>368BD60502854514</RequestId> 
    <HostId> 
     BiUUYp4d9iXfK68jKVxWZEp25m5je166M0ZY1VmoPk9pN9A69HLHcff6WIVLWk1B 
    </HostId> 
</Error> 

Làm cách nào chúng tôi có thể sử dụng các ký tự không phải ISO-8859-1, chẳng hạn như unicode, trong tiêu đề phản hồi-nội dung-bố trí?

+0

AWS Diễn đàn chủ đề: https://forums.aws.amazon.com/thread.jspa?threadID=133257 –

Trả lời

4

Như đã đề cập bởi this StackOverflow answer, Không có cách nào có thể tương tác để mã hóa các tên không phải ASCII trong Nội dung-Bố trí. Khả năng tương thích của trình duyệt là một mớ hỗn độn.

Cách chúng tôi kết thúc để làm điều đó để nó hoạt động trong tất cả các trình duyệt là thay thế tất cả các ký tự không phải ISO-8859-1 bằng '-'. Dưới đây là các mã:

private static readonly Encoding ContentDispositionHeaderEncoding = Encoding.GetEncoding("ISO-8859-1"); 

public static string GetWebSafeFileName(string fileName) 
{ 
    // We need to convert the file name to ISO-8859-1 due to browser compatibility problems with the Content-Disposition Header (see: https://stackoverflow.com/a/216777/1038611) 
    var webSafeFileName = Encoding.Convert(Encoding.Unicode, ContentDispositionHeaderEncoding, Encoding.Unicode.GetBytes(fileName)); 

    // Furthermore, any characters not supported by ISO-8859-1 will be replaced by « ? », which is not an acceptable file name character. So we replace these as well. 
    return ContentDispositionHeaderEncoding.GetString(webSafeFileName).Replace('?', '-'); 
} 

Sau câu trả lời Alex Couper, tôi tìm thấy một cách .net để mã hóa các ký tự khác ASCII không bằng cách gọi một phương pháp nội bộ trong HttpEncoder

Gọi chức năng nội bộ được không được khuyến nghị vì chúng có thể thay đổi trong các phiên bản tương lai của khung công tác! Hơn nữa điều này sẽ không hoạt động trong tất cả các trình duyệt như đã đề cập ở trên. Tôi để cái này ở đây trong trường hợp ai đó tuyệt đối cần làm điều này.

var type = typeof(System.Web.Util.HttpEncoder); 
var methodInfo = type.GetMethod("UrlEncodeNonAscii", BindingFlags.NonPublic | BindingFlags.Instance, null, new [] { typeof(string), typeof(Encoding) }, null); 
object[] parameters = {fileName, Encoding.UTF8}; 

var encoder = new System.Web.Util.HttpEncoder(); 

var encodedFileName = (string) methodInfo.Invoke(encoder, parameters); 
+0

Oh wow, microsoft có chức năng này được thực hiện và đang ẩn nó! Bạn có thể lấy hàm gốc trong tệp CS nguồn [ở đây] (http://referencesource.microsoft.com/# System.Web/xsp/system/Web/Util/HttpEncoder.cs) Nếu ai đó có thể làm cho nó hoạt động trong vb.net thì sẽ ổn thôi! Tôi không có ý tưởng làm thế nào để chuyển đổi "IntToHex ((b >> 4) & 0xf);" một phần! (Và chuyển đổi trực tuyến không thể quá) – foxontherock

+1

Đây là một phần trong VB.net: IntToHex ((b >> 4) Và & Hf) –

5

Tôi gặp sự cố này và tôi đã giải quyết vấn đề bằng cách mã hóa chuỗi unicode một cách chính xác.

tôi ở python boto đất:

>>> import urllib 
>>> encoded = urllib.quote('Unicode FileName ᗩ Test.txt') 
>>> print encoded 

"Unicode%20%E1%97%A9%20filename.txt" 

Sau đó, sử dụng chuỗi mã hóa này làm giá trị cho các phản ứng tiêu đề có nội dung bố trí.

Trong Java Tôi tin rằng bạn có thể đạt được kết quả tương tự với:

URLEncoder.encode(original_string, "UTF-8") 

Hy vọng điều này sẽ giúp người khác tại một số điểm!

+1

tôi thấy chức năng này (trong .net): System.Web.HttpUtility.UrlEncode (fileName , Encoding.UTF8). Vấn đề là nó cũng sẽ thay thế dấu cách bằng ký tự + và nó cũng sẽ mã hóa hầu hết các ký tự không phải chữ cái như ', làm cho tên của tệp được tải xuống trông lộn xộn. Tôi đã tìm thấy chức năng hoàn hảo cho công việc nhưng thật đáng buồn được đánh dấu là nội bộ (trong HttpEncoder.cs) vì vậy nó không thể được sử dụng trực tiếp mà không có một số hack. // Trình trợ giúp mã hóa các ký tự url không phải ASCII chỉ Chuỗi nội bộ UrlEncodeNonAscii (chuỗi str, Mã hóa e) –

Các vấn đề liên quan