Josef Voda | Soubory v LS |
| Zdravím, řeším následují problém. Mám přílohu v dokumentu vloženou přes WWW. Načítám ji přes NotesDocument.GetAttachment("Jmeno"). Potřeboval bych z ni načítat data, nejspíše to půjde jen po blocích a postupně ukládat do proměnné jednotlivé bloky. Nakonec vypsat. Jedná se o binární čtení. Zkoušel jsem načítání přes "Open Priloha.Name for binary as F", ale asi to nebude to pravé. Jestli jste to někdo řešil, tak dejte prosím nějakou hlášku. Dík Pepa |
Tomáš Hanus | Pravé |
28.07.2008 16:03:30
ID: 2706.1
| Nechodí to, nebo to má chodit jinak? Já s tím problémy neměl. |
Josef Voda | Soubory v LS |
IT
29.07.2008 09:01:04
ID: 2706.2
| Nechodí, na konzoli to hlásí, že nemůže najít soubor. |
Martin Humpolec | Re: Soubory v LS |
29.07.2008 10:25:32
ID: 2706.3
| Tak on Open otevírá soubor na disku, kdežto GetAttachment ti vrátí odkaz na objekt v dokumentu, takže to moc kompatibilní není. Takže pomocí ExtractFile ho uložit na disk a pak už by to mělo jít. |
Josef Voda | Soubory |
IT
29.07.2008 12:19:38
ID: 2706.4
| Vím, že GetAttachment mi vrací odkaz na objekt v dokumentu. Jak jsem kdysi potřeboval http hlavičkum která by vyvola dialog na uložení. Tak tu mám a když ji předám objekt.Name nebo objekt.Source, dialog se objeví, ale neuloží se mi na disk nic. Když dám pravým tl. na myši uložit cíl, tak se příloha uloží. Asi pletu 2 věci dohromady, ale jak donutit aby se objekt(příloha) uložil u klienta na disk a ne přes ExtractFile na disk serveru? Dík |
Martin Humpolec | Re: Soubory v LS |
29.07.2008 16:28:49
ID: 2706.5
| Acha, tak té http hlavičce v tom parametru kde specifikuješ cestu k zdrojovému souboru musíš uvést link1 a pak by to mohlo fungovat, pokud jsme usledoval tvé myšlenky :) |
Josef Voda | Soubory v LS |
IT
29.07.2008 16:49:28
ID: 2706.6
| Dík za tip, ale bohužel to nefunguje. Mysšlenky jsi usledoval .-) |
Tomáš Hanus | A co |
30.07.2008 11:04:40
ID: 2706.7
| link1 kde místo fileattachment příjde třeba priloha.pdf. Pokud jsem usledoval :d tvé myšlenky :D
|
Josef Voda | RE: A co |
IT
30.07.2008 11:20:42
ID: 2706.8
| To jsem zkoušel, ale hodí to celou cestu jako název souboru spojenou podtržítkem. Potřebuju dostat přílohu na klientský lokální disk. Příloha je v dokumentu daná přes WWW. Načítám ji přes GetAttachment a do http hlavicky dám NotesEmbeddeObject (jmenuje se Priloha), Priloha.Name. Hláška je v pořádku, ale když se dá uložit tak se vytvoří prázdný soubor. Tak nevím co je blbě. Ale dík ?) |
Martin Humpolec | Re: Soubory v LS |
30.07.2008 13:03:58
ID: 2706.9
| Hoď sem kus kódu, asi jsme tě neusledovali správně :) nějak žiji v domnění, že stahování souboru jako takového ti funguje, jediné co potřebuješ je udělat link, který zavolá agenta, ten nastaví hlavičky, aby se browser donutil soubor stáhnout a nikoliv otevřít a tam potřebuješ cestu k souboru. Pokud to tak opravdu je, tak jsme snad radili dobře, pokud sem dáš kód toho agenta tak máme šanci pomoci, jinak jenom hádáme. |
Tomáš Hanus | to Martin Humpolec |
30.07.2008 14:29:28
ID: 2706.10
| Možná první náležitý příspěvek :) |
Josef Voda | Kousek kódu |
IT
31.07.2008 09:38:49
ID: 2706.11
|
Set Doc = Db.GetDocumentByUNID(UNID)'Vybere dokument podle predaneho UNID Dim Priloha As NotesEmbeddedObject Set Priloha = Doc.GetAttachment(SouborNazev)
Dim Soubor As Variant Soubor = Evaluate({(@ReplaceSubstring("} + Priloha.Name + {";" ";"%20"))}) 'Uprava mezer
Print ({Content-length:} + Str(Priloha.FileSize)) Print ({Content-desciption: File Transfer}) Print ({Content-disposition: attachment; filename=} + ({./VwAll/} + Doc + {/$FILE/} + Soubor(0))
--------------------------------------------------
Posílám kousek kódu.
Koukal jsem jak to řeší v PHP a tam se musí otevřít soubor a číst data. |
Martin Humpolec | Re: Soubory v LS |
31.07.2008 12:02:30
ID: 2706.12
| Jo tak to máš pravdu, pak se tam musí poslat vlastní obsah souboru. V tom posledním řádku tvého kódu stačí napsat vlastní jméno souboru (Soubor(0)), ale jak tam dostat obsah souboru je otázkou.
Co by mohlo zabrat (ale současně jsem to nezkoušel) je
Print [/database.nsf/VwAll/UNID/$File/Soubor(0)] což by mělo udělat přesměrování na další stránku, otázkou je jak zůstanou hlavičky, uvidíš zda to zabere nebo ne. |
Josef Voda | Soubory v LS |
IT
31.07.2008 13:31:14
ID: 2706.13
| Tak mi to bohužel nefunguje. Nešlo by nějak přílohu přes GetAttachment otevřít jako soubor třeba v RAM a poslat obsah souboru do prohlížeče? |
Martin Humpolec | Re: Soubory v LS |
31.07.2008 13:58:19
ID: 2706.14
| Ono bohužel LS umí pracovat jenom se soubory na disku, tuhle to řešili na codestore.net pomocí Javy a nějak se jim to snad povedlo, tak koukni tam. Zas na druhou stranu proč bys nemohl dát vždy extract na disk serveru, tam odsud načíst pomocí NotesStream, poslat do browseru a nakonec smazat. Akorát přemýšlím zda by mě to za to stálo, nebo bych raději naučil uživatele klikat pravým tlačítkem a dát Save as |
Josef Voda | Soubory v LS |
IT
31.07.2008 14:34:51
ID: 2706.15
| S tím NotesStream to nepůjde. Mám verzi R5. Ale asi začnu lidi učit. :-) Díky moc |
Josef Voda | Soubory v LS |
04.08.2008 14:26:19
ID: 2706.16
| Ještě zkouším číst ze souboru "Open Soubor for binary access read as #F" a "Get F, , Data". Přesto se nic nenačte a vypadá to, že server skončil v nekonečné smyčce. Get mám v cyklu "Do While Not Eof(F)". Podle helpu by to mělo chodit, ale nechodí. Asi tam mám někde botu ale nevím kde. Díky za případné rady.
|
Honza K. | Re: Soubory v LS |
04.08.2008 15:13:25
ID: 2706.17
| Jak je inicializovaná proměnná Data? Pokud je to String o proměnné délce a nebyl před použitím nastaven na nějakou hodnotu, pak funkce Get nic nenačte...
Honza |
Josef Voda | Re: |
04.08.2008 15:34:52
ID: 2706.18
| Proměnná je deklarovaná "Dim Data As String". A inicializaci mám dělanou (Data=""). Pepa |
Honza K. | Re |
04.08.2008 15:47:34
ID: 2706.19
| Pomocí Dim Data as String*1024 získáš string o pevné délce jednoho kilobajtu a přesně tolik dat se do něj uloží. Nevím, jak velký je ten soubor, ale jestli je větší, zkusil bych navyšovat velikost toho string, aby to bylo efektivnější (maximálně do 32 kilo)...
Honza |
Josef Voda | Re: |
04.08.2008 21:17:14
ID: 2706.20
| Dík za tip. Soubor má cca. 4 MB, což bohužel asi nepůjde v LS zpracovat. No uvidím, možná by to šlo jako pole, ale asi to je blbost. Pepik |
Honza K. | Soubory v LS |
05.08.2008 08:06:16
ID: 2706.21
| Ten soubor budeš číst ve smyčce, ne najednou... Ještě jsem se na to trochu díval, string používá 2 bajty na znak, takže string*1024 vlastně přečte najednou 2 kilobajty. Blbý je, když velikost souboru není přesně násobek velikosti daného stringu, do kterého se načítá (což je vlastně vždy), protože při čtení posledního bloku to vyhodí chybu ohledně pokusu čtení za konec souboru. Ta situace se ale dá odchytit a pak už postupovat po jednom bajtu, což nebude moc efektivní, ale nic jiného s tím asi neuděláš... Pokud to tedy nechceš napsat v Javě, tam je práce se čtením a zapisováním souborů udělaná lépe...
měj se Honza |
Josef Voda | Re: |
05.08.2008 09:13:00
ID: 2706.22
| Dík za tip. V Javě bych to napsal, ale žádné zkušenosti s ní bohužel nemám.
Pepik |
Josef Voda | Soubory v LS |
05.08.2008 12:10:57
ID: 2706.23
| Zkouším to číst po blocích ve smyčce, ale nějak mi to nejde. |
Honza K. | Soubory v LS |
05.08.2008 12:39:17
ID: 2706.24
| Jak vypadá ten kód? |
Josef Voda | Soubory v LS |
05.08.2008 12:54:51
ID: 2706.25
| Dim Data As String*1024 Dim Nacteno As String
Do Until Eof(F) Get F, , Data Nacteno=Nacteno+Data Loop
print Nacteno |
Honza K. | Soubory v LS |
05.08.2008 14:05:27
ID: 2706.26
| Myšlenkou je, že načteš kus dat, rovnou s ním něco uděláš, čteš další kus, zase s ním něco uděláš a pořád dokola až do konce souboru. Pokud má ten soubor 4MB, pak bych řekl, že načtení do jednoho řetězce fungovat nebude...
Honza |
Josef Voda | RE: |
05.08.2008 14:14:11
ID: 2706.27
| To jo, ale myslel jsem, číst to po blocích a uložit do proměnné, která bude obsahovat již přečtená data a knim ve smyčce připojí další blok. Pokud vím, tak datovej typ string může obsahovat velikost až 2GB dat.
Pepik |
Honza K. | Soubory v LS |
05.08.2008 14:28:37
ID: 2706.28
| Beru zpět, máš pravdu, string o proměnné délce je omezen jen dostupnou pamětí. V čem je tedy problém?
H. |
Josef Voda | RE: |
06.08.2008 08:46:29
ID: 2706.29
| Problém je v tom, že mi server hlásí overflow i když to mám ve smyčce "Do While Not Eof(F)..... Loop"
Pepik |
Honza K. | Soubory v LS |
06.08.2008 09:45:03
ID: 2706.30
| Hmm, nemáš tam nějaké počítadlo? |
Josef Voda | RE: |
06.08.2008 10:42:10
ID: 2706.31
| Zkoušel jsem to s ním i bez něj, ale výsledek je stejný. Pepik |
Josef Voda | RE: |
06.08.2008 10:58:09
ID: 2706.32
| Zkoušel jsem to s počítadlem i bez něj, ale výsledek je stejnej. Pepik |
Honza K. | Re: |
06.08.2008 13:22:01
ID: 2706.33
| Ahoj, omlouvám se za pozdní odezvu, ale obnovoval jsem stránku jako blázen a pořád viděl jen 30 záznamů, až když jsem v URL dal na konci &start=30, viděl jsem další odpovědi. Takhle je to na dlouhé lokte, nechceš sem dát ten kus kódu, kterým čteš soubor a zpracováváš ho a se zvýrazněným řádkem, kde to hodí tu chybu Overflow? Ještě se v debuggeru podívej, jakou hodnotu ta proměnná má, když to spadne...
Honza |
Josef Voda | RE: |
06.08.2008 13:42:12
ID: 2706.34
| dim Precteno as string*1024 dim Data as String
Pozice = 0 Do While Not Eof(F) If ((Pozice + BlokDat) > Velikost) Then BlokDat = Velikost Else BlokDat = 1024 End If Precteno = "" Get F, BlokDat, Precteno Data = Data + Precteno Pozice = Pozice + BlokDat Loop print Data
|
Honza K. | Re |
06.08.2008 16:47:39
ID: 2706.35
| Hmm, asi už pro oči nevidím, podle helpu je druhý parametr funkce Get označení pozice, kde se má se čtením dat začít. Podle toho kódu tedy pokaždé začíná na pozici 1024 až na konci čte přesně na konci souboru...
Já to zkoušel na tomhle kódu, víceméně jen otevře vstupní soubor a co načte, zapíše rovnou do výstupního souboru, ale funguje to. Snad ti to pomůže...
on Error Goto errhandler Dim fileNum As Integer fileNum = Freefile
Const FILENAME = "c:\temp\input.txt" Open FILENAME For Binary As fileNum Dim fileNum2 As Integer fileNum2 = Freefile Open "c:\temp\output.txt" For Binary As fileNum2 Const STRING_SIZE = 512 Dim data As String*STRING_SIZE Dim lastPos As Long 'pozice v souboru pri cteni Dim fileSize As Long 'velikost souboru fileSize = Filelen(FILENAME) 'nacitaji se data po 1024 bytech Do While (lastPos + (STRING_SIZE * 2)) <= fileSize 'string vlastne cte 2 byty Get fileNum, ,data Put fileNum2, ,data lastPos = Loc(fileNum) Loop 'zbyva mene nez 1024 bajtu, zahlasilo by to chybu, uz musime cist po jednom... Dim remainder As Long remainder = fileSize - lastPos Dim singleChar As Byte Dim i As Long For i = 1 To remainder Get fileNum,, singleChar Put fileNum2,,singleChar Next Close #fileNum Close #fileNum2 getOut: Exit Sub errhandler: Msgbox Err & ": " & Error & ", line " & Erl & ", position in file " & Loc(fileNum) Resume getOut
|
Josef Voda | RE: |
07.08.2008 12:58:11
ID: 2706.36
| Vypadá to zajímavě. Akorát s tím datovým typem Byte budou problémy, proto že mám verzi R5 a zde byte není. No uvidím. Dík |
Honza K. | Re |
07.08.2008 13:52:41
ID: 2706.37
| Tak to je pakárna, vůbec jsem si to neuvědomil, pětky jsem neviděl už hrozně dlouho. Podívej se do helpu na přehled datových typů, jestli tam je něco, co zabírá 1 byte... |
Analytik | Možná tam je funkce |
07.08.2008 14:22:29
ID: 2706.38
| InputB - čte to po bajtu a ten strkat do výstupu. Dávej pozor na práva uživatelů pro přístup k souborovému systému. Potom, když otevíráš soubor na binary čtení, není to omezeno max 256 soubory paralelně? Dále by (snad) šlo udělat detach souboru do FS a vyprintit do headeru co je potřeba a potom ještě location - v něm dát link na soubor ve fajl systému a mohlo by to fungovat bez problémů. Ale 5-tky mám někde hooooooooooooodně daleko. Zkusil bych to. Také nesmíš zapomenout killnout soubory na serveru - například nočním agentem všechny. A bude posekáno.
Zdar. |
Josef Voda | RE: |
07.08.2008 14:46:34
ID: 2706.39
| Koukal jsem, ale bohužel nic neodpovídá. Tak uvidím, jestli to půjde nějak obejít. Pepik |
Josef Voda | to Analytik |
07.08.2008 14:58:08
ID: 2706.40
| Soubor mám detachnutý do FS, a zněj se pokuším číst. Nerozumím, ale tomu "location". Pepik |
Analytik | Popis HTTP 1.1 |
07.08.2008 16:14:12
ID: 2706.41
| 14.14 Content-Location
The Content-Location entity-header field MAY be used to supply the resource location for the entity enclosed in the message when that entity is accessible from a location separate from the requested resource's URI. A server SHOULD provide a Content-Location for the variant corresponding to the response entity; especially in the case where a resource has multiple entities associated with it, and those entities actually have separate locations by which they might be individually accessed, the server SHOULD provide a Content-Location for the particular variant which is returned.
Content-Location = "Content-Location" ":" ( absoluteURI | relativeURI )
The value of Content-Location also defines the base URI for the entity.
The Content-Location value is not a replacement for the original requested URI; it is only a statement of the location of the resource corresponding to this particular entity at the time of the request. Future requests MAY specify the Content-Location URI as the request- URI if the desire is to identify the source of that particular entity.
A cache cannot assume that an entity with a Content-Location different from the URI used to retrieve it can be used to respond to later requests on that Content-Location URI. However, the Content- Location can be used to differentiate between multiple entities retrieved from a single requested resource, as described in section 13.6.
If the Content-Location is a relative URI, the relative URI is interpreted relative to the Request-URI.
The meaning of the Content-Location header in PUT or POST requests is undefined; servers are free to ignore it in those cases.
více na linku: link1 |
Analytik | Zkusil jsem to, tkto |
08.08.2008 15:38:39
ID: 2706.42
| Print |Content-Length: 566136| Print |Content-description: File Transfer| Print |Content-disposition: attachment; filename= Test.pdf| REM Print |Content-Location = ... link na filesystem ... | For i = 1 To 566136 Print |A| Next Funguje skvěle. PDF obsahuje samé A. Kód si uprav.
Dále bych doporučil následující: detach souboru do filesystému. Nastav si header = Print |Content-Length: 566136| Print |Content-description: File Transfer| Print |Content-disposition: attachment; filename= Test.pdf|
dále si dej cyklus: For i = 1 To pocetbajtu v souboru neco = Input$ ( 1 , [#]fileNumber ) Print neco Next
cyklus jde udelat i jinak, ale nemam na to cas. Snad to pojede v te 5-ce.
Zdar vsem. |
Josef Voda | RE: |
11.08.2008 10:50:44
ID: 2706.43
| Tak jsem zkoušelcyklus, ale bohužel celý soubor nenačte. Pepik |
Analytik | Je potreba se mrknout do Helpu 5-ek |
11.08.2008 14:45:37
ID: 2706.44
| tam by mel byt example, ktery pouzijes. Mozna bude lepsi while nez for. Jinak je potreba davat pozor / melo by to byt po znacich bez jejich interpretace vyznamu znaku, jinak to nemusi chodit. Priklad je syrovy / je potreba ho doladit. Nevim, jestli na to budu mit cas.
Zdar |
Josef Voda | RE |
11.08.2008 20:57:39
ID: 2706.45
| Zkoušel jsem to s while i do while ale výsledek byl stejný. Jedu podle helpu, ale výsledky se bohužel nedostavují. Pomohl jsi mi už dost, tak se na to klidně vykašly. Nějak to vyřeším. Když nebude zbytí, tak to vyšvihnu v PHP + MySQL, ale moc se mi do toho nechce. :-( Pepik |
Josef Voda | Soubory v LS |
14.08.2008 13:53:29
ID: 2706.46
| Jak teda udělat, aby to vracelo při čtení jen 1 byte a ne 2.
Dík. Pepa |