2015-06-08 6 views
11

भले ही मैं सामग्री प्रकार को टेक्स्ट/एचटीएमएल पर सेट करता हूं, यह एस 3 पर एप्लिकेशन/ऑक्टेट-स्ट्रीम के रूप में समाप्त होता है।एस 3 पर अपलोड की गई फ़ाइल में सामग्री प्रकार एप्लिकेशन/ऑक्टेट-स्ट्रीम क्यों नहीं है जब तक कि मैं फ़ाइल का नाम नहीं देता। एचटीएमएल

ByteArrayInputStream contentsAsStream = new ByteArrayInputStream(contentAsBytes); 
ObjectMetadata md = new ObjectMetadata(); 
md.setContentLength(contentAsBytes.length); 
md.setContentType("text/html"); 
s3.putObject(new PutObjectRequest(ARTIST_BUCKET_NAME, artistId, contentsAsStream, md)); 

यदि फिर भी मैं फ़ाइल को नाम इतना है कि यह .html

s3.putObject(new PutObjectRequest(ARTIST_BUCKET_NAME, artistId + ".html", contentsAsStream, md)); 

तो यह काम करता है के साथ समाप्त होता है।

क्या मेरा एमडी ऑब्जेक्ट अभी अनदेखा किया जा रहा है? मैं इस प्रोग्रामेटिक रूप से समय के साथ कैसे मिल सकता हूं क्योंकि मुझे हजारों फाइलें अपलोड करने की ज़रूरत है, इसलिए केवल एस 3 यूआई में नहीं जा सकते हैं और सामग्री टाइप मैन्युअल रूप से ठीक कर सकते हैं।

+0

कैसे आप सामग्री प्रकार की जाँच करते हैं? एडब्ल्यूएस एस 3 यूआई या एपीआई द्वारा? यदि एपीआई द्वारा आप कोड पेस्ट कर सकते हैं। आप एडब्ल्यूएस SDK के नवीनतम संस्करण का उपयोग करते हैं? यदि ऐसा है तो आप एक के साथ प्रयास कर सकते हैं। – Jakozaur

+0

मैं S3 सांत्वना –

+0

इम एडब्ल्यूएस का उपयोग कर संस्करण 1.9.6 के भीतर एक webbrowser में contentype को देख खोलने के द्वारा सामग्री प्रकार की जाँच जो मैं नवीनतम –

उत्तर

1

It seems कि

फ़ाइलें अपलोड, एडब्ल्यूएस S3 जावा ग्राहक सही सामग्री प्रकार को निर्धारित करने के लिए अगर एक अभी तक सेट नहीं किया गया प्रयास करेंगे। उपयोगकर्ता स्ट्रीम अपलोड करते समय उचित सामग्री प्रकार सेट करने के लिए ज़िम्मेदार हैं। यदि कोई सामग्री प्रकार प्रदान नहीं किया गया है और फ़ाइल नाम, डिफ़ॉल्ट सामग्री प्रकार, "एप्लिकेशन/ऑक्टेट-स्ट्रीम", द्वारा निर्धारित नहीं किया जा सकता है।

फ़ाइल को एक .html एक्सटेंशन देना सही प्रकार सेट करने का एक तरीका प्रदान करता है।

उदाहरणों के मुताबिक, मैं देख रहा हूं कि कोड करना चाहिए जो आप करना चाहते हैं। :/

+0

कारण है कि यह रीसेट है करने के लिए "application/ओकटेट धारा" जब यह स्पष्ट नहीं होता माना जा रहा स्पष्ट रूप से "टेक्स्ट/एचटीएमएल" पर सेट करें। – Raniz

+0

क्योंकि उस सामग्री प्रकार को उचित रूप से सेट नहीं किया गया है, इसलिए सबसे अधिक उपयुक्त लगता है। लेकिन अगर आप putObject विधि का उपयोग करने से पहले सामग्री प्रकार सेट करते हैं, तो सामग्री प्रकार सेट हो जाएगा। आप मेरा जवाब देख सकते हैं। –

9

आपको अपने कोड में कुछ और करना होगा। मैंने अभी 1.9.6 एस 3 एसडीके का उपयोग करके अपने कोड उदाहरण की कोशिश की है और फ़ाइल को "टेक्स्ट/एचटीएमएल" सामग्री प्रकार मिलता है।

यहाँ सटीक (ग्रूवी) कोड है:

class S3Test { 
    static void main(String[] args) { 

     def s3 = new AmazonS3Client() 

     def random = new Random() 
     def bucketName = "raniz-playground" 
     def keyName = "content-type-test" 

     byte[] contentAsBytes = new byte[1024] 
     random.nextBytes(contentAsBytes) 

     ByteArrayInputStream contentsAsStream = new ByteArrayInputStream(contentAsBytes); 
     ObjectMetadata md = new ObjectMetadata(); 
     md.setContentLength(contentAsBytes.length); 
     md.setContentType("text/html"); 
     s3.putObject(new PutObjectRequest(bucketName, keyName, contentsAsStream, md)) 

     def object = s3.getObject(bucketName, keyName) 
     println(object.objectMetadata.contentType) 
     object.close() 
    } 
} 

कार्यक्रम प्रिंट

पाठ/html

और S3 मेटाडाटा ही कहते हैं:

S3 properties view

यहाँ संचार नेट (अपाचे HTTP कॉमन्स डीबग लॉगिंग के सौजन्य से) पर भेजा हैं:

>> PUT /content-type-test HTTP/1.1 
>> Host: raniz-playground.s3.amazonaws.com 
>> Authorization: AWS <nope> 
>> User-Agent: aws-sdk-java/1.9.6 Linux/3.2.0-84-generic Java_HotSpot(TM)_64-Bit_Server_VM/25.45-b02/1.8.0_45 
>> Date: Fri, 12 Jun 2015 02:11:16 GMT 
>> Content-Type: text/html 
>> Content-Length: 1024 
>> Connection: Keep-Alive 
>> Expect: 100-continue 
<< HTTP/1.1 200 OK 
<< x-amz-id-2: mOsmhYGkW+SxipF6S2+CnmiqOhwJ62WfWUkmZk4zU3rzkWCEH9P/bT1hUz27apmO 
<< x-amz-request-id: 8706AE3BE8597644 
<< Date: Fri, 12 Jun 2015 02:11:23 GMT 
<< ETag: "6c53debeb28f1d12f7ad388b27c9036d" 
<< Content-Length: 0 
<< Server: AmazonS3 

>> GET /content-type-test HTTP/1.1 
>> Host: raniz-playground.s3.amazonaws.com 
>> Authorization: AWS <nope> 
>> User-Agent: aws-sdk-java/1.9.6 Linux/3.2.0-84-generic Java_HotSpot(TM)_64-Bit_Server_VM/25.45-b02/1.8.0_45 
>> Date: Fri, 12 Jun 2015 02:11:23 GMT 
>> Content-Type: application/x-www-form-urlencoded; charset=utf-8 
>> Connection: Keep-Alive 
<< HTTP/1.1 200 OK 
<< x-amz-id-2: 9U1CQ8yIYBKYyadKi4syaAsr+7BV76Q+5UAGj2w1zDiPC2qZN0NzUCQNv6pWGu7n 
<< x-amz-request-id: 6777433366DB6436 
<< Date: Fri, 12 Jun 2015 02:11:24 GMT 
<< Last-Modified: Fri, 12 Jun 2015 02:11:23 GMT 
<< ETag: "6c53debeb28f1d12f7ad388b27c9036d" 
<< Accept-Ranges: bytes 
<< Content-Type: text/html 
<< Content-Length: 1024 
<< Server: AmazonS3 

और यह भी व्यवहार है कि source code को देखकर हमें पता चलता है है - आप सामग्री टाइप एसडीके सेट करते हैं इसे ओवरराइड नहीं करेगा।

+1

यह स्पष्ट नहीं करता है कि यह "टेक्स्ट/एचटीएमएल" पर सेट होने पर "एप्लिकेशन/ऑक्टेट-स्ट्रीम" पर रीसेट क्यों किया जाता है। : पी – Tim

+2

नहीं, लेकिन यह * साबित करता है * यह नहीं करता है =) – Raniz

0

क्या आपके पास अपने S3 खाते पर डिफ़ॉल्ट माइम सामग्री पर कोई ओवरराइड है? यह लिंक देखने के लिए इस लिंक को देखें: How to override default Content Types

वैसे भी, ऐसा लगता है कि आपका S3 क्लाइंट फ़ाइल की सामग्री द्वारा सही माइम-प्रकार निर्धारित करने में विफल रहता है, इसलिए यह एक्सटेंशन पर निर्भर करता है।ओकटेट धारा व्यापक रूप से इस्तेमाल डिफ़ॉल्ट सामग्री माइम प्रकार जब एक ब्राउज़र/सर्वलेट माइम प्रकार निर्धारित नहीं कर सकता है: Is there any default mime type?

4

क्योंकि आप सामग्री प्रकार putObject विधि का उपयोग कर, बस भेजने से पहले अंत पर स्थापित करने के लिए;

 ObjectMetadata md = new ObjectMetadata(); 

     InputStream myInputStream = new ByteArrayInputStream(bFile); 
     md.setContentLength(bFile.length); 
     md.setContentType("text/html"); 
     md.setContentEncoding("UTF-8"); 

     s3client.putObject(new PutObjectRequest(bucketName, keyName, myInputStream, md)); 

और अपलोड करने के बाद, सामग्री प्रकार के रूप में "पाठ/html"

enter image description here

यहाँ एक काम कर डमी कोड है, कि बाहर की जाँच के लिए निर्धारित है, मैं बस की कोशिश की है और यह है काम कर रहे;

public class TestAWS { 

    //TEST 
    private static String bucketName = "whateverBucket"; 

    public static void main(String[] args) throws Exception { 
     BasicAWSCredentials awsCreds = new BasicAWSCredentials("whatever", "whatever"); 

     AmazonS3 s3client = new AmazonS3Client(awsCreds); 
     try 
     { 
      String uploadFileName = "D:\\try.txt"; 
      String keyName = "newFile.txt"; 

      System.out.println("Uploading a new object to S3 from a file\n"); 
      File file = new File(uploadFileName); 

      //bFile will be the placeholder of file bytes 
      byte[] bFile = new byte[(int) file.length()]; 
      FileInputStream fileInputStream=null; 

      //convert file into array of bytes 
      fileInputStream = new FileInputStream(file); 
      fileInputStream.read(bFile); 
      fileInputStream.close(); 

      ObjectMetadata md = new ObjectMetadata(); 

      InputStream myInputStream = new ByteArrayInputStream(bFile); 
      md.setContentLength(bFile.length); 
      md.setContentType("text/html"); 
      md.setContentEncoding("UTF-8"); 

      s3client.putObject(new PutObjectRequest(bucketName, keyName, myInputStream, md)); 
     } catch (AmazonServiceException ase) 
     { 
      System.out.println("Caught an AmazonServiceException, which " 
        + "means your request made it " 
        + "to Amazon S3, but was rejected with an error response" 
        + " for some reason."); 
      System.out.println("Error Message: " + ase.getMessage()); 
      System.out.println("HTTP Status Code: " + ase.getStatusCode()); 
      System.out.println("AWS Error Code: " + ase.getErrorCode()); 
      System.out.println("Error Type:  " + ase.getErrorType()); 
      System.out.println("Request ID:  " + ase.getRequestId()); 
     } catch (AmazonClientException ace) 
     { 
      System.out.println("Caught an AmazonClientException, which " 
        + "means the client encountered " 
        + "an internal error while trying to " 
        + "communicate with S3, " 
        + "such as not being able to access the network."); 
      System.out.println("Error Message: " + ace.getMessage()); 
     } 

    } 

} 

आशा है कि इससे मदद मिलती है।

संबंधित मुद्दे