Все технические форумы на одном сайте Удобный поиск информации с популярных форумов в одном месте
Вопрос: Как загрузить файлы с сервера по очереди

Как реализовать загрузку файлов по очереди?

Язык Kotlin:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class PreviewPresenterImpl
    @Inject constructor(view: PreviewView,
                        private val interactor: HistoryInteractor,
                        private var disposable: CompositeDisposable = CompositeDisposable())
    : BasePresenter<PreviewView>(view)
 
    override fun loadFiles(originalPathways: ArrayList<String>) {
        for (fileUrl in originalPathways) {
            disposable.add(interactor.downloadFile(fileUrl)
                    .observeOn(AndroidSchedulers.mainThread())
                    .subscribeOn(Schedulers.io())
                    .flatMap(this::saveFile)
                    .subscribe(
                            { file -> files.add(file.absolutePath) },
                            { error -> Log.e("TAG", "{$error.message}") },
                            { Log.d("TAG", "completed") })
            )
        }
 
        view.onFilesLoadedComplete(files)
    }
понятно что цикл завершает работу намного раньше чем загружаются файлы, а как сделать что бы все файлы загрузились по очереди, или как узнать что все загрузки завершены?

код рабочий, проблема в том что цикл закачивается раньше чем завершатся загрузка (что как бы логично), соответственно метод оно то вызвало, а толку от этого никакого.
Ответ: Нужно создать поток, подать на вход список, метод выше пробегает этот список. Типо такого:
Java
1
2
Single.just(originalPathways)
                    .flatMapPublisher(Flowable::fromIterable)
Дальше уже твой запрос, но метод view.onFilesLoadedComplete(files) должен быть вызван по окончании потока, то бишь в onComplete/onSuccess/onNext.
Вопрос: как загрузить файл в папку assets

Java
1
file = new File("/assets/","sagittarius.xml");
При запуске зависает на прогрес-баре. Помогите разобраться

Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
package ru.load.file;
 
import android.app.*;
import android.os.*;
import android.view.*;
import android.view.ViewGroup.*;
import android.widget.*;
import java.io.*;
import java.net.*;
import org.apache.http.ssl.*;
 
public class MainActivity extends Activity {
 
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Button load = new Button(this);
        load.setText("Загрузить");
        load.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    downloadFile("http://i.horo.ru/rss/sagittarius.xml");
                }
            });
        setContentView(load, new LayoutParams(LayoutParams.WRAP_CONTENT,
                                              LayoutParams.WRAP_CONTENT));
    }
 
 
    private void downloadFile(String url) {
        final ProgressDialog progressDialog = new ProgressDialog(this);
 
        new AsyncTask<String, Integer, File>() {
            private Exception m_error = null;
 
            @Override
            protected void onPreExecute() {
                progressDialog.setMessage("Downloading ...");
                progressDialog.setCancelable(false);
                progressDialog.setMax(100);
                progressDialog
                    .setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
 
                progressDialog.show();
            }
 
            @Override
            protected File doInBackground(String... params) {
                URL url;
                HttpURLConnection urlConnection;
                InputStream inputStream;
                int totalSize;
                int downloadedSize;
                byte[] buffer;
                int bufferLength;
 
                File file = null;
                FileOutputStream fos = null;
 
                try {
                    url = new URL(params[0]);
                    urlConnection = (HttpURLConnection) url.openConnection();
 
                    urlConnection.setRequestMethod("GET");
                    urlConnection.setDoOutput(true);
                    urlConnection.connect();
                    
                    //создание файла в папке assets
                    file = new File("/assets/","sagittarius.xml");
                    
                    //создание файла в папке Temp
                    //file = File.createTempFile("temp", ".xml");
                    fos = new FileOutputStream(file);
                    inputStream = urlConnection.getInputStream();
 
                    totalSize = urlConnection.getContentLength();
                    downloadedSize = 0;
 
                    buffer = new byte[1024];
                    bufferLength = 0;
 
                    // читаем со входа и пишем в выход, 
                    // с каждой итерацией публикуем прогресс
                    while ((bufferLength = inputStream.read(buffer)) > 0) {
                        fos.write(buffer, 0, bufferLength);
                        downloadedSize += bufferLength;
                        publishProgress(downloadedSize, totalSize);
                    }
 
                    fos.close();
                    inputStream.close();
 
                    return file;
                } catch (MalformedURLException e) {
                    e.printStackTrace();
                    m_error = e;
                } catch (IOException e) {
                    e.printStackTrace();
                    m_error = e;
                }
 
                return null;
            }
 
            // обновляем progressDialog
            protected void onProgressUpdate(Integer... values) {
                progressDialog
                    .setProgress((int) ((values[0] / (float) values[1]) * 100));
            };
 
            @Override
            protected void onPostExecute(File file) {
                // отображаем сообщение, если возникла ошибка
                if (m_error != null) {
                    m_error.printStackTrace();
                    return;
                }
                // закрываем прогресс и удаляем временный файл
                progressDialog.hide();
                //file.delete();
            }
        }.execute(url);
    }
}
Ответ: если файл уже создан в строке
Java
1
file = File.createTempFile("temp", ".xml");
то нафига там писать getAssets() что бы его окрыть?
Java
1
2
3
4
5
        try {
            FileInputStream is = new FileInputStream(file);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
Вопрос: Получить список файлов сервера указав путь

Есть сервер на java рабочий. Принимает запросы от клиента и выводит список txt файлов прописанного в путе диска, затем по введенному названию тхт файла выводит его содержимое
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
package test;
 
 
import java.net.*;
import java.io.*;
import java.util.*;
 
public class test {
    public static void main(String[] args){      
        try{
        ServerSocket ss = new ServerSocket(3333);
        while(true)
        new HttpConnect(ss.accept());       
        }catch(ArrayIndexOutOfBoundsException ae)
        {
            System.err.println("Usage server port");
            System.exit(0);
        }catch(IOException e)
        {
            System.out.println(e);
        }
    }
}
 
    class HttpConnect extends Thread{
    private Socket sock;
    HttpConnect(Socket s)
    {
    sock = s;
    setPriority(NORM_PRIORITY - 1);
    start();
    }
    public void run()
    {
    try
    {
        PrintWriter pw = new PrintWriter(new OutputStreamWriter(sock.getOutputStream()),true);
            BufferedReader br = new BufferedReader(new InputStreamReader(sock.getInputStream()));
            String req = br.readLine();
            String files = "";
            System.out.println("Request: " + req);
            StringTokenizer st = new StringTokenizer(req);
            if((st.countTokens() >= 2) && st.nextToken().equals("POST")){
                if((req = st.nextToken()).endsWith("/") || req.equals(""))
                    req += "";
                    File f = new File(req);
                    MyFileFilter filter = new MyFileFilter();
                    File[] list = f.listFiles(filter);
                    for(int i = 0; i < list.length; i++) 
                    {
                       files += list[i].toString() + "\n";
                    }
                    pw.write("HTTP/1.1 200 OK\n");
                    pw.write(files);
                    pw.write("HTTP/1.1 200 OK\n");
                    pw.flush();
                } else pw.println("HTTP/1.1 400 Bad RequestW");
            
            if(req != null)
            {
            String res = br.readLine();
            System.out.println("Request: " + res);
            StringTokenizer st1 = new StringTokenizer(res);
            if((st1.countTokens() >= 2) && st1.nextToken().equals("POST")){
                if((res = st1.nextToken()).endsWith("/") || res.equals(""))
                    res += "";
                try{
                    File f = new File(req + res);
                    BufferedReader bfr = new BufferedReader(new FileReader(f));
                    char[] data = new char[(int)f.length()];
                    bfr.read(data);
                    pw.println("HTTP/1.1 200 OK\n");
                    pw.write(data);
                    pw.flush();
                }
                catch(FileNotFoundException fe)
                {
                    pw.println("HTTP/1.1 404 Not FoundX\n");
                }catch(IOException ioe)
                {
                    System.out.println(ioe);
                }
                } else pw.println("HTTP/1.1 400 Bad RequestW");
            }
            
            sock.close();
            }catch(IOException e)
            {
                System.out.println(e);
            }
    }
}
class MyFileFilter implements FileFilter {
    public boolean accept(File pathname) 
    {
       return pathname.isFile() && pathname.getName().endsWith(".txt");
    }
}

Так же есть клиент, который запрашивает путь директории и затем имя txt файла, для вывода его содержимого
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
public static void main(String[] args) {
        String host = "182.176.11.3";
        int port = 3333;
        String file = null;
        String path = null;
        Scanner sc = new Scanner(System.in);
        path = sc.nextLine();
        try{
            Socket sock = new Socket(host, port);
            PrintWriter pw = new PrintWriter(new OutputStreamWriter(sock.getOutputStream()),true);
            pw.println("POST " + path + " HTTP/1.1");
            BufferedReader br = new BufferedReader(new InputStreamReader(sock.getInputStream()));
            String line1 = br.readLine();
            StringTokenizer se = new StringTokenizer(line1);
            String res = "HTTP/1.1 200 OK";
            while((line1 = br.readLine()) != null)
            {
                if (res.equals(line1))
                {
                    break;  
                }
                else
                {
                    System.out.println(line1);
                }
            }
            file = sc.nextLine();
            pw.println("POST " + file + " HTTP/1.1\n");
            String line = null;
            line = br.readLine();
            StringTokenizer st = new StringTokenizer(line);
            String code = null;
            while((line = br.readLine()) != null)
                System.out.println(line);
            sock.close();
            byte bKbdInput[] = new byte[256];
            int lenght = System.in.read(bKbdInput);
        }catch(Exception e)
        {
            System.err.println(e);
        }
    }   
}
Подключение к серверу сделал
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public void conn(View view) {
        AsyncTask<String, Integer, Boolean> task = new AsyncTask<String, Integer, Boolean>() {
            @Override
            protected Boolean doInBackground(String... params) {
                try {
                    s = new Socket(params[0], 3333);
                    is = s.getInputStream();
                    os = s.getOutputStream();
                } catch (Exception ioe) {
                    return false;
                }
                return true;
            }
 
            @Override
            protected void onPostExecute(Boolean param) {
                editText3.setText((param)? "Подключено" : " Нет ответа");
            }
        };
        task.execute(spinner.getSelectedItem().toString());
    }
Как переделать клиент java под андроид чтобы получить хотя бы список файлов например в мултилайн текст?
Ответ: в андроиде ВСЕ операции с сетью должны проводиться НЕ из UI потока
поэтому ответ - нет
Вопрос: Передать файл через socket или через ftp api

Посоветуйте как поступить:
Есть файл на устройстве его нужно загрузить на сервер.
1 Загружать через socket, создав на сервере программку которая будет принимать файл (api).
2 Загружать через ftp, сервер имеет свой ftp. Прописать логин и пароль в андроид приложении и пусть оно работает со встроенным api.
Ответ: powowstal, наверное свой api на базе простого upload через post будет проще и гибче чем разборки с ftp
Вопрос: Считать файл и передать в String[]

Доброго, нужно загрузить файл с сервера и прочитать его в String[] ,
сейчас у меня так, но это именно в файле java т.е чтобы добавлять картинки мне нужно будет писать затем билдить и выкладывать
Java
1
2
3
4
5
6
private String[] mStrings={
            "http://example.com/images/image0.png",
            "http://example.com/images/image1.png",
            "http://example.com/images/image10.png"
 
    };
Ответ: shavuz, дык вроде и нет вариантов, под базу SQLite делать я так не знаю пока еще скулайт на яве, т.к стоящих примеров не было

Сорри за оффтоп но есть ли мобильная версия этого форума?

Добавлено через 7 часов 0 минут
Кажется я еще нашел ошибку у себя
Java
1
2
3
4
5
6
7
    public void onItemClick(int mPosition)
    {
        String tempValues = mStrings[mPosition];
        Intent intent = new Intent(MainActivity.this, full_tricks.class);
        intent.putExtra("image", tempValues);
        startActivity(intent);
    }
во втором активити я объявляю так
Java
1
String image;
но показывает урл null

Добавлено через 9 часов 51 минуту
проблему решил, я забыл вставить
Java
1
image = getIntent().getExtras().getString("image");
Вопрос: WebView и html файлы в Internal Storage

С html файлами, находящимися в assets, можно работать из WebView, переходя по относительным сылкам от одного к другому.
Мне нужно, чтоб приложение загрузило систему html файлов из Интернета и позволило пользователю просматривать их через WebView. Но в runtime возможно загрузить файлы из Интернета только в internal storage или cache. Возможно ли так же "прозрачно" прыгать по ссылкам в WebView по файлам, находящимся там?

Добавлено через 53 минуты
И еще - возможно ли в html файлах, находящихся в Internal Storage, ссылаться на ресурсы (css, картинки), находящиеся в assets или res/raw?
Ответ: Тупо нет возможности проверить сейчас. Была бы - не спрашивал.
Вопрос: Получить дескриптор файла

Если wav файл лежит в assets, то я дескрипторы получаю так:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
mAssetManager = getAssets();
        // получим идентификаторы звуков
        soundDot = loadSound("Dot.wav");
 
// ...
 
   private int loadSound(String fileName) {
        AssetFileDescriptor afd;
        try {
            afd = mAssetManager.openFd(fileName);
        } catch (IOException e) {
            e.printStackTrace();
            Toast.makeText(getApplicationContext(), "Не могу загрузить файл " + fileName,
                    Toast.LENGTH_SHORT).show();
            return -1;
        }
        return mSoundPool.load(afd, 1);
    }
А если файл лежит не в assets, то как получить дескрипторы? Файл создаю в приложении и сохраняю так:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
        String FileDashName = "Dash.wav"; // имя файла
        fos = null;
        try {
            fos = openFileOutput(FileDashName, Context.MODE_PRIVATE);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        try {
            fos.write(FileDash);
        } catch (IOException e) {
            e.printStackTrace();
        }
        try {
            fos.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
В эмуляторе он оказывается в каталоге files.
Ответ: Получилось.
Java
1
2
3
4
5
6
7
8
9
10
soundDot = loadSound("Dot.wav");
 
//...
 
 
 private int loadSound(String fileName) {
        String mypatch = getApplicationInfo().dataDir; // путь к директории приложения
        mypatch = mypatch + "/files/"+fileName;
        return mSoundPool.load(mypatch, 1);
    }
Вопрос: Не могу загрузить изображение по его URL адресу в битмап

Не получается загрузить изображение по его URL адресу в Bitmap, минуя imageView (т.к. попадая туда, приходится создавать еще один битмап, после которого качество сильно ухудшается, необходим исходник изображения).

Пробовал это, но без толку.

Bitmap mIcon11 = null;

String stTMP = "http://www.google.ru/intl/en_com/images/logo_plain.png";

InputStream in = new java.net.URL(stTMP).openStream();


mIcon11 = BitmapFactory.decodeStream(in);
Ответ: так можно просто сохранять по очереди в один временный файл где-нибудь в кеше и с него брать нужные параметры
если файл не будет показываться сразу во вьюшке то наверное и нет смысла его грузить и держать в оперативке
Вопрос: Загрузить фото на сервер

Здравствуйте, подскажите как загрузить изображение, в данном случае фото, на сервер, как его передать обработчику в php файл? В процессе: камера у меня фоткает и сохраняет изображения на sd-карте, php на принятие изображения готов, как их связать? подскажите может библиотека какая есть или буду рада просто полезным ссылкам)
Сильно не ругайтесь, я только учусь)
Ответ: ILNAR_93, не надо так делать. Это допустимо только в том случае, если сервер использует формат RPC и нет возможности отправлять multipart данные
Вопрос: Выполнение внешнего Java файла или обновление приложения

В общем, вопрос таков, мне надо автоматически обновлять приложение без плеймаркета и обновления всего приложения в целом... Есть основной класс,он выполняет почти все действия, но т.к. мне надо обновить автоматически без спроса пользователя, то я так понимаю нужно выполнять внешние Java файлы... Где то слышал что можно как то через гит или т.п., но так и не понял о чем речь идет, слышал еще о каких то серверах, но тоже таки не понял как да что, хотя бы потому что я просто "слышал". Так вот, мне либо надо узнать как выполнять Java код из внешнего файла, как загрузить и т.д. сам разберусь, а вот как его выполнить... Ну или подскажите как обновлять или что вроде того через сайты такие как гит, ну, или какие то там... Спасибо заранее
Ответ: zealot01, манифест и сам код, основной мне менять не надо, это уже при полном обновлении приложения все делать буду, а вот надо обновлять (запускать) внешние классы которые загружу... и вот так будет обновления частичные