2015-06-08 5 views
11

Obwohl ich den Inhaltstyp auf text/html setze, landet er als application/octet-stream auf S3.Warum hat die hochgeladene Datei den Inhaltstyp application/octet-stream, es sei denn, ich benenne die Datei .html

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)); 

Wenn ich die Datei jedoch benennen, so dass es mit .html es funktioniert

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

dann.

Wird mein MD-Objekt ignoriert? Wie kann ich das programmatisch umgehen? Im Laufe der Zeit muss ich Tausende von Dateien hochladen, damit ich nicht einfach in die S3-Benutzeroberfläche wechseln und den contentType manuell korrigieren kann.

+0

Wie überprüfen Sie den Inhaltstyp? In AWS S3 UI oder API? Wenn per API können Sie den Code einfügen. Verwenden Sie die neueste Version von AWS SDK? Wenn ja, kannst du es mit einem versuchen. – Jakozaur

+0

Ich überprüfe Inhaltstyp, indem ich den Inhaltstyp in einem Webbrowser innerhalb der S3-Konsole –

+0

schaue, der aws Version 1.9.6 benutzt, die ich das späteste –

Antwort

1

It seems dass

Beim Hochladen von Dateien wird der AWS S3-Java-Client den richtigen Inhaltstyp zu bestimmen versuchen, wenn man noch nicht festgelegt wurde. Benutzer sind verantwortlich dafür, dass beim Hochladen von Streams ein passender Inhaltstyp festgelegt wird. Wenn kein Inhaltstyp angegeben ist und nicht anhand des Dateinamens ermittelt werden kann, wird der Standardinhaltstyp "application/octet-stream", , verwendet.

Wenn Sie der Datei die Erweiterung .html zuweisen, können Sie den richtigen Typ festlegen.

Entsprechend den Beispielen, die ich betrachtet habe, sollte der Code, den Sie zeigen, sein tun, was Sie tun möchten. :/

+0

ward Dies erklärt nicht, warum es auf "application/octet-stream" wann zurückgesetzt wird explizit auf "text/html" gesetzt. – Raniz

+0

Da dieser Inhaltstyp nicht richtig eingestellt zu sein scheint, ist aws am besten geeignet. Wenn Sie jedoch kurz vor der Verwendung der putObject-Methode den Inhaltstyp festlegen, wird der Inhaltstyp festgelegt. Sie können meine Antwort überprüfen. –

9

Sie müssen etwas anderes in Ihrem Code tun. Ich habe gerade Ihr Codebeispiel mit dem 1.9.6 S3 SDK versucht und die Datei erhält den Inhaltstyp "text/html".

Hier ist die genaue (Groovy) Code:

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() 
    } 
} 

Das Programm druckt

text/html

Und die S3-Metadaten sagt das gleiche:

S3 properties view

Hier

sind die Kommunikation über das Netz gesendet werden (mit freundlicher Genehmigung von Apache HTTP Commons Debug Logging):

>> 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 

Und das ist auch das Verhalten, das uns auf den source code Suche zeigt - wenn Sie den Inhalt geben Sie das SDK gesetzt wird es nicht überschreiben.

+1

Dies erklärt nicht, warum es auf "application/octet-stream" zurückgesetzt wird, wenn explizit "text/html" eingestellt ist. : P – Tim

+2

Nein, aber es * beweist * das es nicht =) – Raniz

0

Haben Sie eine Überschreibung des Standardmime-Inhalts in Ihrem S3-Konto? Sehen Sie sich diesen Link an, um zu sehen, wie Sie ihn überprüfen können: How to override default Content Types.

Wie auch immer, es sieht so aus, als ob Ihr S3-Client den korrekten MIME-Typ nicht anhand des Inhalts der Datei ermitteln kann. Daher ist die Erweiterung erforderlich.Octet-Stream ist der weit verbreitete Standard-Content-Mime-Typ, wenn ein Browser/Servlet nicht den MIME-Typen bestimmen kann: Is there any default mime type?

4

Weil Sie Inhaltstyp festgelegt am Ende kurz vor dem Senden mit der putObject Methode;

 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)); 

Und nach dem Upload wird Inhaltstyp als "text/html"

enter image description here

hier ein Arbeits Blindkode ist, dass Check-out, ich habe gerade versucht, und es ist Arbeiten;

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()); 
     } 

    } 

} 

Hoffe, dass es hilft.

Verwandte Themen