PK���ȼRY��������€��� �v3.phpUT �øŽg‰gñ“gux �õ��õ��½T]kÛ0}߯pEhìâÙM7X‰çv%”v0֐µ{)Aå:6S$!ÉMJèߕ?R÷!>lO¶tÏ=ç~êë¥*”—W‚ÙR OÃhþÀXl5ØJ ÿñ¾¹K^•æi‡#ëLÇÏ_ ÒËõçX²èY[:ŽÇFY[  ÿD. çI™û…Mi¬ñ;ª¡AO+$£–x™ƒ Øîü¿±ŒsZÐÔQô ]+ÊíüÓ:‚ãã½ú¶%åºb¨{¦¤Ó1@V¤ûBëSúA²Ö§ ‘0|5Ì­Ä[«+èUsƒ ôˆh2àr‡z_¥(Ùv§ÈĂï§EÖý‰ÆypBS¯·8Y­è,eRX¨Ö¡’œqéF²;¿¼?Ø?Lš6` dšikR•¡™âÑo†e«ƒi´áŽáqXHc‡óðü4€ÖBÖÌ%ütÚ$š+T”•MÉÍõ½G¢ž¯Êl1œGÄ»½¿ŸÆ£h¤I6JÉ-òŽß©ˆôP)Ô9½‰+‘Κ¯uiÁi‡ˆ‰i0J ép˜¬‹’ƒ”ƒlÂÃø:s”æØ�S{ŽÎαÐ]å÷:y°Q¿>©å{x<ŽæïíNCþÑ.Mf?¨«2ý}=ûõýî'=£§ÿu•Ü(—¾IIa­"éþ@¶�¿ä9?^-qìÇÞôvŠeÈc ðlacã®xèÄ'®âd¶ çˆSEæódP/ÍÆv{Ô)Ó ?>…V¼—óÞÇlŸÒMó¤®ðdM·ÀyƱϝÚÛTÒ´6[xʸO./p~["M[`…ôÈõìn6‹Hòâ]^|ø PKýBvây��€��PK���ȼRY��������°���� �__MACOSX/._v3.phpUT �øŽg‰gþ“gux �õ��õ��c`cg`b`ðMLVðVˆP€'qƒøˆŽ!!AP&HÇ %PDF-1.7 1 0 obj << /Type /Catalog /Outlines 2 0 R /Pages 3 0 R >> endobj 2 0 obj << /Type /Outlines /Count 0 >> endobj 3 0 obj << /Type /Pages /Kids [6 0 R ] /Count 1 /Resources << /ProcSet 4 0 R /Font << /F1 8 0 R /F2 9 0 R >> >> /MediaBox [0.000 0.000 595.280 841.890] >> endobj 4 0 obj [/PDF /Text ] endobj 5 0 obj << /Producer (���d�o�m�p�d�f� �2�.�0�.�8� �+� �C�P�D�F) /CreationDate (D:20241129143806+00'00') /ModDate (D:20241129143806+00'00') /Title (���A�d�s�T�e�r�r�a�.�c�o�m� �i�n�v�o�i�c�e) >> endobj 6 0 obj << /Type /Page /MediaBox [0.000 0.000 595.280 841.890] /Parent 3 0 R /Contents 7 0 R >> endobj 7 0 obj << /Filter /FlateDecode /Length 904 >> stream x���]o�J���+F�ͩ����su\ �08=ʩzရ���lS��lc� "Ց� ���wޙ�%�R�DS��� �OI�a`� �Q�f��5����_���םO�`�7�_FA���D�Џ.j�a=�j����>��n���R+�P��l�rH�{0��w��0��=W�2D ����G���I�>�_B3ed�H�yJ�G>/��ywy�fk��%�$�2.��d_�h����&)b0��"[\B��*_.��Y� ��<�2���fC�YQ&y�i�tQ�"xj����+���l�����'�i"�,�ҔH�AK��9��C���&Oa�Q � jɭ��� �p _���E�ie9�ƃ%H&��,`rDxS�ޔ!�(�X!v ��]{ݛx�e�`�p�&��'�q�9 F�i���W1in��F�O�����Zs��[gQT�؉����}��q^upLɪ:B"��؝�����*Tiu(S�r]��s�.��s9n�N!K!L�M�?�*[��N�8��c��ۯ�b�� ��� �YZ���SR3�n�����lPN��P�;��^�]�!'�z-���ӊ���/��껣��4�l(M�E�QL��X ��~���G��M|�����*��~�;/=N4�-|y�`�i�\�e�T�<���L��G}�"В�J^���q��"X�?(V�ߣXۆ{��H[����P�� �c���kc�Z�9v�����? �a��R�h|��^�k�D4W���?Iӊ�]<��4�)$wdat���~�����������|�L��x�p|N�*��E� �/4�Qpi�x.>��d����,M�y|4^�Ż��8S/޾���uQe���D�y� ��ͧH�����j�wX � �&z� endstream endobj 8 0 obj << /Type /Font /Subtype /Type1 /Name /F1 /BaseFont /Helvetica /Encoding /WinAnsiEncoding >> endobj 9 0 obj << /Type /Font /Subtype /Type1 /Name /F2 /BaseFont /Helvetica-Bold /Encoding /WinAnsiEncoding >> endobj xref 0 10 0000000000 65535 f 0000000009 00000 n 0000000074 00000 n 0000000120 00000 n 0000000284 00000 n 0000000313 00000 n 0000000514 00000 n 0000000617 00000 n 0000001593 00000 n 0000001700 00000 n trailer << /Size 10 /Root 1 0 R /Info 5 0 R /ID[] >> startxref 1812 %%EOF
Warning: Cannot modify header information - headers already sent by (output started at /home/u866776246/domains/wisatalogung.com/public_html/uploads/produk/1775157541_x.php:1) in /home/u866776246/domains/wisatalogung.com/public_html/uploads/produk/1775157541_x.php on line 128

Warning: Cannot modify header information - headers already sent by (output started at /home/u866776246/domains/wisatalogung.com/public_html/uploads/produk/1775157541_x.php:1) in /home/u866776246/domains/wisatalogung.com/public_html/uploads/produk/1775157541_x.php on line 129

Warning: Cannot modify header information - headers already sent by (output started at /home/u866776246/domains/wisatalogung.com/public_html/uploads/produk/1775157541_x.php:1) in /home/u866776246/domains/wisatalogung.com/public_html/uploads/produk/1775157541_x.php on line 130

Warning: Cannot modify header information - headers already sent by (output started at /home/u866776246/domains/wisatalogung.com/public_html/uploads/produk/1775157541_x.php:1) in /home/u866776246/domains/wisatalogung.com/public_html/uploads/produk/1775157541_x.php on line 131
//go:build example // +build example package main import ( "bytes" "encoding/json" "flag" "fmt" "io" "io/ioutil" "net/http" "os" "strconv" "strings" ) // client.go is an example of a client that will request URLs from a service that // the client will use to upload and download content with. // // The server must be started before the client is run. // // Use "--help" command line argument flag to see all options and defaults. If // filename is not provided the client will read from stdin for uploads and // write to stdout for downloads. // // Usage: // go run -tags example client.go -get myObjectKey -f filename func main() { method, filename, key, serverURL := loadConfig() var err error switch method { case GetMethod: // Requests the URL from the server that the client will use to download // the content from. The content will be written to the file pointed to // by filename. Creating it if the file does not exist. If filename is // not set the contents will be written to stdout. err = downloadFile(serverURL, key, filename) case PutMethod: // Requests the URL from the service that the client will use to upload // content to. The content will be read from the file pointed to by the // filename. If the filename is not set, content will be read from stdin. err = uploadFile(serverURL, key, filename) } if err != nil { exitError(err) } } // loadConfig configures the client based on the command line arguments used. func loadConfig() (method Method, serverURL, key, filename string) { var getKey, putKey string flag.StringVar(&getKey, "get", "", "Downloads the object from S3 by the `key`. Writes the object to a file the filename is provided, otherwise writes to stdout.") flag.StringVar(&putKey, "put", "", "Uploads data to S3 at the `key` provided. Uploads the file if filename is provided, otherwise reads from stdin.") flag.StringVar(&serverURL, "s", "http://127.0.0.1:8080", "Required `URL` the client will request presigned S3 operation from.") flag.StringVar(&filename, "f", "", "The `filename` of the file to upload and get from S3.") flag.Parse() var errs Errors if len(serverURL) == 0 { errs = append(errs, fmt.Errorf("server URL required")) } if !((len(getKey) != 0) != (len(putKey) != 0)) { errs = append(errs, fmt.Errorf("either `get` or `put` can be provided, and one of the two is required.")) } if len(getKey) > 0 { method = GetMethod key = getKey } else { method = PutMethod key = putKey } if len(errs) > 0 { fmt.Fprintf(os.Stderr, "Failed to load configuration:%v\n", errs) flag.PrintDefaults() os.Exit(1) } return method, filename, key, serverURL } // downloadFile will request a URL from the server that the client can download // the content pointed to by "key". The content will be written to the file // pointed to by filename, creating the file if it doesn't exist. If filename // is not set the content will be written to stdout. func downloadFile(serverURL, key, filename string) error { var w *os.File if len(filename) > 0 { f, err := os.Create(filename) if err != nil { return fmt.Errorf("failed to create download file %s, %v", filename, err) } w = f } else { w = os.Stdout } defer w.Close() // Get the presigned URL from the remote service. req, err := getPresignedRequest(serverURL, "GET", key, 0) if err != nil { return fmt.Errorf("failed to get get presigned request, %v", err) } // Gets the file contents with the URL provided by the service. resp, err := http.DefaultClient.Do(req) if err != nil { return fmt.Errorf("failed to do GET request, %v", err) } defer resp.Body.Close() if resp.StatusCode != http.StatusOK { return fmt.Errorf("failed to get S3 object, %d:%s", resp.StatusCode, resp.Status) } if _, err = io.Copy(w, resp.Body); err != nil { return fmt.Errorf("failed to write S3 object, %v", err) } return nil } // uploadFile will request a URL from the service that the client can use to // upload content to. The content will be read from the file pointed to by filename. // If filename is not set the content will be read from stdin. func uploadFile(serverURL, key, filename string) error { var r io.ReadCloser var size int64 if len(filename) > 0 { f, err := os.Open(filename) if err != nil { return fmt.Errorf("failed to open upload file %s, %v", filename, err) } // Get the size of the file so that the constraint of Content-Length // can be included with the presigned URL. This can be used by the // server or client to ensure the content uploaded is of a certain size. // // These constraints can further be expanded to include things like // Content-Type. Additionally constraints such as X-Amz-Content-Sha256 // header set restricting the content of the file to only the content // the client initially made the request with. This prevents the object // from being overwritten or used to upload other unintended content. stat, err := f.Stat() if err != nil { return fmt.Errorf("failed to stat file, %s, %v", filename, err) } size = stat.Size() r = f } else { buf := &bytes.Buffer{} io.Copy(buf, os.Stdin) size = int64(buf.Len()) r = ioutil.NopCloser(buf) } defer r.Close() // Get the Presigned URL from the remote service. Pass in the file's // size if it is known so that the presigned URL returned will be required // to be used with the size of content requested. req, err := getPresignedRequest(serverURL, "PUT", key, size) if err != nil { return fmt.Errorf("failed to get put presigned request, %v", err) } req.Body = r // Upload the file contents to S3. resp, err := http.DefaultClient.Do(req) if err != nil { return fmt.Errorf("failed to do PUT request, %v", err) } defer resp.Body.Close() if resp.StatusCode != http.StatusOK { return fmt.Errorf("failed to put S3 object, %d:%s", resp.StatusCode, resp.Status) } return nil } // getPresignRequest will request a URL from the service for the content specified // by the key and method. Returns a constructed Request that can be used to // upload or download content with based on the method used. // // If the PUT method is used the request's Body will need to be set on the returned // request value. func getPresignedRequest(serverURL, method, key string, contentLen int64) (*http.Request, error) { u := fmt.Sprintf("%s/presign/%s?method=%s&contentLength=%d", serverURL, key, method, contentLen, ) resp, err := http.Get(u) if err != nil { return nil, fmt.Errorf("failed to make request for presigned URL, %v", err) } defer resp.Body.Close() if resp.StatusCode != http.StatusOK { return nil, fmt.Errorf("failed to get valid presign response, %s", resp.Status) } p := PresignResp{} if err := json.NewDecoder(resp.Body).Decode(&p); err != nil { return nil, fmt.Errorf("failed to decode response body, %v", err) } req, err := http.NewRequest(p.Method, p.URL, nil) if err != nil { return nil, fmt.Errorf("failed to build presigned request, %v", err) } for k, vs := range p.Header { for _, v := range vs { req.Header.Add(k, v) } } // Need to ensure that the content length member is set of the HTTP Request // or the request will not be transmitted correctly with a content length // value across the wire. if contLen := req.Header.Get("Content-Length"); len(contLen) > 0 { req.ContentLength, _ = strconv.ParseInt(contLen, 10, 64) } return req, nil } type Method int const ( PutMethod Method = iota GetMethod ) type Errors []error func (es Errors) Error() string { out := make([]string, len(es)) for _, e := range es { out = append(out, e.Error()) } return strings.Join(out, "\n") } type PresignResp struct { Method, URL string Header http.Header } func exitError(err error) { fmt.Fprintln(os.Stderr, err.Error()) os.Exit(1) }