Toon posts:

[Java] Secure Connection file upload werkt niet

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hey,

Ik werk met ChannelSftp om een secure connection te doen. De connectie werkt goed, maar als ik een file erop wil zetten, lukt dat niet. Ik krijg geen foutmelding, maar de file daar is achteraf gewoon leeg. Op mijn computer staat de file echter goed...
Het ligt dus aan de InputStream denk ik, maar FileInputStream is toch de juiste voor een File?
Ik kom er dus echt niet aan uit :) Iemand die het ziet? Thx!

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
File file = new File(veld+".txt");
BufferedWriter outWriter = new BufferedWriter(new FileWriter(file));

int n = spelers.size();
for(int i=0; i<n; i++) {
    Speler speler = spelers.get(i);
    outWriter.write(speler.getNaam()+","+speler.getScore()+","+speler.getEerste());
    if(i!=n-2) {
        outWriter.newLine();
    }
}

InputStream is = new FileInputStream(file);
c.put(is,file.getName());

[ Voor 6% gewijzigd door Verwijderd op 11-12-2008 16:19 ]


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 25-09 16:59

Janoz

Moderator Devschuur®

!litemod

Op je computer staat de file goed nadat je programma gedraait heeft. Ik denk dat op het moment dat je hem put dit nog niet het geval is.

Zet op regel 12 eens een outWriter.close(); om ervoor te zorgen dat het bestand ook daadwerkelijk weggeschreven wordt.


Verder nog een algemene opmerking mbt je code. Als je toch tijdelijke bestanden aan het aanmaken bent om weg te sturen, gebruik daarvoor dan de mogelijkheden die File je biedt om een tempfile aan te maken.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • Spockz
  • Registratie: Augustus 2003
  • Laatst online: 21-09 10:08

Spockz

Live and Let Live

Moet je je BufferedWriter niet ook nog flushen? Ik geloof dat er laatst ook zo'n topic als dit was.

C'est le ton qui fait la musique. | Blog | @linkedin
R8 | 18-55 IS | 50mm 1.8 2 | 70-200 2.8 APO EX HSM | 85 1.8


Verwijderd

Topicstarter
Aha dat was het dus inderdaad :) Ik deed wel een outWriter.close(), maar pas na de "put". Ik wist niet dat de file pas weggeschreven wordt bij een close.

Tempfile is idd nog een goed idee, ik zal het eens bekijken.

Bedankt!


edit @ Spockz: Hehe dat was ook mijn topic. Maar het had toen ook niets met flush te maken.

[ Voor 17% gewijzigd door Verwijderd op 11-12-2008 16:35 ]


Verwijderd

Topicstarter
@Janoz: Als ik een temp file maak, krijgt hij echter een rare naam, bvb "4x4.txt" wordt "4x41430422346981236061.txt".
Kan ik dit vermijden? Want het moet echt "4x4.txt" zijn, aangezien de file achteraf weer ingelezen wordt met deze exacte naam.

  • BalusC
  • Registratie: Oktober 2000
  • Niet online

BalusC

Carpe diem

aangezien de file achteraf weer ingelezen wordt met deze exacte naam.
Maak dan geen temporary file aan.

[ Voor 48% gewijzigd door BalusC op 11-12-2008 18:03 ]


  • Herko_ter_Horst
  • Registratie: November 2002
  • Niet online
Janoz schreef op donderdag 11 december 2008 @ 16:27:
Verder nog een algemene opmerking mbt je code. Als je toch tijdelijke bestanden aan het aanmaken bent om weg te sturen, gebruik daarvoor dan de mogelijkheden die File je biedt om een tempfile aan te maken.
vs.
BalusC schreef op donderdag 11 december 2008 @ 18:02:
[...]
Maak dan geen temporary file aan.
Altijd leuk, tegenstrijdige adviezen :)

Je kunt het voor elkaar krijgen door expliciet de bestandsnaam voor op de server op te geven: op regel 14 i.p.v. file.getName() de juiste naam opgeven (die je op regel 1 maakt, even bewaren in een String).

En die InputStream, die close() je neem ik aan ook nog ergens?

[ Voor 6% gewijzigd door Herko_ter_Horst op 11-12-2008 18:08 ]

"Any sufficiently advanced technology is indistinguishable from magic."


  • BalusC
  • Registratie: Oktober 2000
  • Niet online

BalusC

Carpe diem

Ik zie nergens dat het "achteraf inlezen" in dezelfde code blok zit. Aangezien er absoluut geen aanleiding is tot opnieuw inlezen na het FTP´en, ging ik ervan uit dat hij het bestand langer nodig heeft dan tijdelijk.

Verwijderd

Topicstarter
Sorry voor de verwarring, het wordt pas weer gelezen via de SFTP als het programma weer opgestart wordt.

Het bij het wegschrijven de juiste naam geven is idd de goede oplossing, dat ik daar niet zelf op gekomen ben ^^

De InputStream close ik niet, zal het maar best doen zeker. Alhoewel ik nog geen problemen heb gehad.

Nogmaals bedankt ;)

  • Herko_ter_Horst
  • Registratie: November 2002
  • Niet online
Ja, sluiten die handel: je hebt al gemerkt tot welke problemen het kan leiden als je streams niet netjes sluit. Jezelf aanwennen dat je het altijd doet is daarom handig.

In principe geldt de regel: wie 'm opent, sluit hem ook (en liefst zo snel als mogelijk). Liefst zet je dit soort acties (met streams, maar ook met bijv. databaseconnecties) in een try-finally constructie, zodat je zeker weet dat de close() altijd wordt aangeroepen.

Het gaat nu waarschijnlijk perongeluk goed omdat ofwel de stream sowieso gesloten wordt omdat het programma stopt, of omdat een bepaald object out of scope raakt, ge-garbage-collect wordt en in z'n finalize() nog iets doet.

"Any sufficiently advanced technology is indistinguishable from magic."

Pagina: 1