** Alibaba Cloud Object Storage Service (OSS) ** speichert Objekte in Ressourcen, die als "Buckets" bezeichnet werden. Post Object verwendet ein HTML-Formular, um die Datei in den angegebenen Bucket hochzuladen.
Der Alibaba Cloud Object Storage Service (OSS) ist ein benutzerfreundlicher Dienst, mit dem Sie große Datenmengen in der Cloud speichern, sichern und archivieren können. OSS fungiert als verschlüsseltes zentrales Repository und bietet Ihnen sicheren Zugriff auf Dateien auf der ganzen Welt. Mit einer garantierten Verfügbarkeit von bis zu 99,9% ist es außerdem ideal für globale Teams und internationales Projektmanagement.
Der Alibaba Cloud Object Storage Service (OSS) speichert Objekte sicher in Ressourcen, die als "Buckets" bezeichnet werden. Mit OSS haben Sie vollen Zugriff auf die Buckets und können die Protokolle und Objekte in jedem Bucket anzeigen. Sie können eine unbegrenzte Anzahl von Objekten in Ihrem Bucket lesen, schreiben, löschen und speichern. Die hohe Leistung von OSS unterstützt mehrere Lese- / Schreibvorgänge gleichzeitig. Die Datenübertragung zum Bucket erfolgt über SSL und ist verschlüsselt.
Post Object verwendet HTML-Formulare anstelle von Put, um Dateien in den angegebenen Bucket hochzuladen. Auf diese Weise können Sie Dateien über Ihren Browser in Ihren Bucket hochladen. Der Wunsch, Post Object in Java zu implementieren, ergibt sich aus kurzen Erklärungen verschiedener Support-Mitarbeiter. Demnach haben Benutzer, die diese Funktion benötigen, verschiedene schwierige Probleme, wenn sie versuchen, die Funktion gemäß der offiziellen Dokumentation zu implementieren. Dies geschieht, weil es keine offizielle Code-Referenz gibt.
Werfen wir einen Blick auf die Schritte, die der Benutzer ausführen sollte.
Die offizielle Website bietet zunächst die HTTP-Anforderungssyntax. Das Format des HTTP-Anforderungsheaders und des mehrteiligen / formulardatencodierten Formularfelds des Nachrichtentexts, um die Parameter zu erfüllen.
Als nächstes werden wir jedes "erforderliche" Formularfeld wie "Datei" und "Schlüssel" in die Formularfeldtabelle einfügen. Der Benutzer fordert eines der Formularfelder an, z. B. "OSSAccessKeyId", "Richtlinie", "Signatur". Sie benötigen außerdem den REST-Anforderungsheader, das Benutzer-Meta x-oss -meta- * und andere optionale Formularfelder.
Wenn Sie dies veröffentlichen, werden einige spezielle Verwendungszwecke und Einschränkungen für einige Formularfelder eingeführt. Es enthält auch eine Reihe von Informationen zu Post-Richtlinien- und Signaturfunktionen und deren Verwendung. ――Die Dokumentation ist bis zu einem gewissen Grad klar, aber es gibt viele Konzepte, die schwer zu verstehen sind, und es ist schwierig, das Problem zu untersuchen. Darüber hinaus gibt es keine Highlights zur fehleranfälligen Implementierung, die Benutzer vor zwei große Herausforderungen stellt: Benutzer können auf zwei große Herausforderungen stoßen, und zwei weitere Aspekte sind betroffen.
Nicht vertraut mit MIME-Codierungen wie mehrteiligen / Formulardaten.
Nicht vertraut mit OSS-Implementierungsregeln zum Parsen von Post-Object-Anforderungen.
Als nächstes werde ich die beiden oben genannten Aspekte erläutern.
Eine ausführliche Einführung in Multipart- / Formulardaten finden Sie unter RFC 2388. Hier sind einige Dinge zu beachten. Lassen Sie uns sie einzeln besprechen.
Content-Disposition: form-data; name=“your_key"
Hinweis: Sowohl ":" als auch ";" folgen dem Leerzeichen.
Content-Disposition: form-data; name="file"; filename="MyFilename.jpg "
Content-Type: image/jpeg
Hinweis: Das ";" vor dem "Dateinamen" hat noch ein Leerzeichen. Ebenso steht im ":" nach dem "Content-Type" ein nachgestelltes Leerzeichen.
Content-Type: multipart/form-data; boundary=9431149156168
Der vierte zu beachtende Punkt ist, dass die Struktur jedes Formularfelds festgelegt ist. Jedes Formularfeld beginnt standardmäßig mit der Grenze "-" +, gefolgt von einem Wagenrücklauf (/ r / n). Darauf folgt die Formularfeldbeschreibung (siehe Punkt 1) und dann / r / n. Wenn der zu übertragende Inhalt eine Datei ist, enthalten die Dateinameninformationen auch den Wagenrücklauf (/ r / n) gefolgt vom Dateiinhaltstyp (siehe Punkt 2). Zusätzlich gibt es einen weiteren Wagenrücklauf (/ r / n), um den eigentlichen Inhalt zu starten, der mit / r / n enden muss.
Beachten Sie auch, dass das letzte Formularfeld mit "-" + Grenze + "-" endet.
Zusätzlich ist die Markierung / r / n erforderlich, um den HTTP-Anforderungsheader von den Body-Informationen (an der Kreuzung des Headers und des ersten Formularfelds) zu unterscheiden. Dies ist im Grunde eine zusätzliche leere Zeile wie ein Dokument, die folgendermaßen aussieht:
Content-Type: multipart/form-data; boundary=9431149156168
--9431149156168
Content-Disposition: form-data; name="key"
Bisher haben wir eine allgemeine Beschreibung der Anforderungssyntax in der offiziellen OSS-Dokumentation und eine zugehörige Analyse im Vergleich zum RFC 2388-Standard bereitgestellt.
Hier werden wir uns mit einigen Einschränkungen befassen, die mit der Verarbeitung verbunden sind, die das OSS-System zum Analysieren von POST-Objektanforderungen ausführt.
Die allgemeine Vorgehensweise von OSS zum Parsen einer POST-Anforderung ist in der folgenden Abbildung als Referenz dargestellt.
Der Ablauf der Anforderungsverarbeitung wird in drei Kernschritten zusammengefasst.
In der Dokumentation wird daher betont, dass das Feld "Datei" im "letzten Feld" platziert wird. Andernfalls haben die Formularfelder nach "Datei" möglicherweise keine Auswirkung. Durch Platzieren des erforderlichen Formularfelds "Schlüssel" nach "Datei" wird sichergestellt, dass das Ergebnis ein ungültiges Argument ist.
Als nächstes werde ich den Arbeitsablauf kurz erläutern, wie in der Abbildung gezeigt.
Dies soll die Länge des Optionsfelds aufgrund der begrenzten Gesamtlänge des Post-Anforderungshauptteils überprüfen. 5) Analysieren Sie ParseContentType mit ParseFile. Analysiert das Feld ContentType im Feld Datei. Dieses Feld ist nicht erforderlich.
Dies endet mit Java-Code (Maven-Projekt), der das Hochladen von Post-Objekten in OSS als Referenz und Verwendung für diejenigen implementiert, die mit OSS vertraut sind.
import javax.activation.MimetypesFileTypeMap;
import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.Map;
/**
* Created by yushuting on 16/4/17.
*/
public class OssPostObject {
private String postFileName = "your_file";
Make sure that the file exists at the path indicated in the run code.
private String ossEndpoint = "your_endpoint";
For example: http://oss-cn-shanghai.aliyuncs.com
private String ossAccessId = "your_accessid"; This is your access AK
private String ossAccessKey = "your_accesskey"; This is your access AK
private String objectName = "your_object_name"; This is the object name after you upload the file
private String bucket = "your_bucket"; Make sure that the bucket you created previously has been created.
private void PostObject() throws Exception {
String filepath=postFileName;
String urlStr = ossEndpoint.replace("http://", "http://"+bucket+"."); This is the URL for the submitted form is the bucket domain name
LinkedHashMap<String, String> textMap = new LinkedHashMap<String, String>();
// key
String objectName = this.objectName;
textMap.put("key", objectName);
// Content-Disposition
textMap.put("Content-Disposition", "attachment;filename="+filepath);
// OSSAccessKeyId
textMap.put("OSSAccessKeyId", ossAccessId);
// policy
String policy = "{\"expiration\": \"2120-01-01T12:00:00.000Z\",\"conditions\": [[\"content-length-range\", 0, 104857600]]}";
String encodePolicy = java.util.Base64.getEncoder().encodeToString(policy.getBytes());
textMap.put("policy", encodePolicy);
// Signature
String signaturecom = com.aliyun.oss.common.auth.ServiceSignature.create().computeSignature(ossAccessKey, encodePolicy);
textMap.put("Signature", signaturecom);
Map<String, String> fileMap = new HashMap<String, String>();
fileMap.put("file", filepath);
String ret = formUpload(urlStr, textMap, fileMap);
System.out.println("[" + bucket + "] post_object:" + objectName);
System.out.println("post reponse:" + ret);
}
private static String formUpload(String urlStr, Map<String, String> textMap, Map<String, String> fileMap) throws Exception {
String res = "";
HttpURLConnection conn = null;
String BOUNDARY = "9431149156168";
try {
URL url = new URL(urlStr);
conn = (HttpURLConnection) url.openConnection();
conn.setConnectTimeout(5000);
conn.setReadTimeout(30000);
conn.setDoOutput(true);
conn.setDoInput(true);
conn.setRequestMethod("POST");
conn.setRequestProperty("User-Agent",
"Mozilla/5.0 (Windows; U; Windows NT 6.1; zh-CN; rv:1.9.2.6)");
conn.setRequestProperty("Content-Type",
"multipart/form-data; boundary=" + BOUNDARY);
OutputStream out = new DataOutputStream(conn.getOutputStream());
// text
if (textMap != null) {
StringBuffer strBuf = new StringBuffer();
Iterator iter = textMap.entrySet().iterator();
int i = 0;
while (iter.hasNext()) {
Map.Entry entry = (Map.Entry) iter.next();
String inputName = (String) entry.getKey();
String inputValue = (String) entry.getValue();
if (inputValue == null) {
continue;
}
if (i == 0) {
strBuf.append("--").append(BOUNDARY).append(
"\r\n");
strBuf.append("Content-Disposition: form-data; name=\""
+ inputName + "\"\r\n\r\n");
strBuf.append(inputValue);
} else {
strBuf.append("\r\n").append("--").append(BOUNDARY).append(
"\r\n");
strBuf.append("Content-Disposition: form-data; name=\""
+ inputName + "\"\r\n\r\n");
strBuf.append(inputValue);
}
i++;
}
out.write(strBuf.toString().getBytes());
}
// file
if (fileMap != null) {
Iterator iter = fileMap.entrySet().iterator();
while (iter.hasNext()) {
Map.Entry entry = (Map.Entry) iter.next();
String inputName = (String) entry.getKey();
String inputValue = (String) entry.getValue();
if (inputValue == null) {
continue;
}
File file = new File(inputValue);
String filename = file.getName();
String contentType = new MimetypesFileTypeMap().getContentType(file);
if (contentType == null || contentType.equals("")) {
contentType = "application/octet-stream";
}
StringBuffer strBuf = new StringBuffer();
strBuf.append("\r\n").append("--").append(BOUNDARY).append(
"\r\n");
strBuf.append("Content-Disposition: form-data; name=\""
+ inputName + "\"; filename=\"" + filename
+ "\"\r\n");
strBuf.append("Content-Type: " + contentType + "\r\n\r\n");
out.write(strBuf.toString().getBytes());
DataInputStream in = new DataInputStream(new FileInputStream(file));
int bytes = 0;
byte[] bufferOut = new byte[1024];
while ((bytes = in.read(bufferOut)) != -1) {
out.write(bufferOut, 0, bytes);
}
in.close();
}
StringBuffer strBuf = new StringBuffer();
out.write(strBuf.toString().getBytes());
}
byte[] endData = ("\r\n--" + BOUNDARY + "--\r\n").getBytes();
out.write(endData);
out.flush();
out.close();
// Read the returned data
StringBuffer strBuf = new StringBuffer();
BufferedReader reader = new BufferedReader(new InputStreamReader(
conn.getInputStream()));
String line = null;
while ((line = reader.readLine()) != null) {
strBuf.append(line).append("\n");
}
res = strBuf.toString();
reader.close();
reader = null;
} catch (Exception e) {
System.err.println("Error in sending a POST request: " + urlStr);
throw e;
} finally {
if (conn != null) {
conn.disconnect();
conn = null;
}
}
return res;
}
public static void main(String[] args) throws Exception {
OssPostObject ossPostObject = new OssPostObject();
ossPostObject.PostObject();
}
}
Bitte beachten Sie, dass Sie pom.xml Folgendes hinzufügen müssen.
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>2.2.1</version>
</dependency>
Mit Post Object können Sie Dateien basierend auf Ihrem Browser in Ihren Bucket hochladen. Die Post-Object-Nachrichtentextcodierung verwendet mehrteilige / Formulardaten. Bei Post-Object-Operationen überträgt das Programm Parameter als Formularfelder im Nachrichtentext. Post Object verwendet AccessKeySecret, um die Signatur der Richtlinie zu berechnen. Das POST-Formularfeld ist eine Option zum Hochladen öffentlicher Lese- / Schreib-Buckets. Wir empfehlen jedoch, dieses Feld zu verwenden, um POST-Anforderungen zu begrenzen.
Recommended Posts