Загрузка и файл POST к странице PHP с Java

Я приезжаю в этот вопрос от противоположного направления. Я воспитывался в программировании с очень немногими пит-стопами на земле Makefile+Emacs. Из моего очень самого раннего компилятора на DOS, Microsoft Quick C, у меня был IDE для автоматизации вещей. Я провел много лет, работая в Visual C++ 6.0, и когда я получил высшее образование в Java Предприятия, я работал с Borland JBuilder и затем обосновался на Eclipse, который стал очень продуктивным для меня.

В течение моего начального самообразования, колледжа и теперь профессиональной карьеры, я приехал, чтобы узнать, что любая основная разработка программного обеспечения, сделанная только в IDE, становится контрпродуктивной. Я говорю это, потому что большая часть IDE хочет, чтобы Вы работали в их специфический стиль I-control-how-the-world-works. Необходимо нарезать и поставить на карту проекты вдоль их строк. Вы имеете, управляют Вашими сборками проекта с помощью их нечетных диалоговых окон. Большая часть IDE управляет сложными зависимостями от сборки между проектами плохо, и зависимости могут быть трудными получить рабочие 100%. Я был в ситуациях, где IDE не произвел бы рабочую сборку моего кода, если я не сделал Чистить/Восстанавливание Все. Наконец, редко существует очевидный способ для перемещения программного обеспечения из разработки и в другие среды как QA или Производство от IDE. Это обычно - clicky фестиваль для получения всех единиц развертывания, созданных, или у Вас есть некоторый неловкий инструмент, который поставщик IDE дает Вам для связывания материала. Но снова, тот инструмент обычно требует, чтобы Ваша структура проекта и сборки абсолютно соответствовала их правилам - и иногда который просто не будет работать на требования Ваших проектов.

я узнал, что, чтобы сделать крупномасштабную разработку с командой, мы можем быть самыми продуктивными, если мы разрабатываем наш код с помощью IDE и делаем все наши сборки, использующие вручную записанные сценарии командной строки. (Нам нравится Муравей Apache за разработку Java.) Мы нашли, что запущение наших скриптов из IDE является просто фестивалем щелчка или кошмаром автоматизации для сложных сборок, это намного легче (и менее разрушительно) к alt+tab к оболочке, и запустите скрипты там.

Ручные сборки требуют, чтобы мы пропустили некоторые тонкости в современном IDE как фоновая компиляция, но что мы получаем, намного более очень важно: уберите и легкие сборки, которые могут жить в нескольких средах. "Одна сборка щелчка" все те гибкие парни говорит о? У нас есть он. Наши сценарии сборки могут быть непосредственно вызваны непрерывными системами интеграции также. Управление сборками через непрерывную интеграцию позволяет нам более официально подготавливать и перемещать Ваше развертывание кода на различных средах, и сообщает нам почти сразу, когда кто-то регистрируется в плохом коде, который повреждает сборку или модульные тесты.

, По правде говоря, мое взятие роли сборки далеко от IDE не причинило нам боль слишком ужасно. intellisense и инструменты рефакторинга в Eclipse все еще абсолютно полезны и допустимы - фоновая компиляция просто служит для поддержки тех инструментов. И, специфическое разрезание Eclipse проектов служило очень хорошим способом мысленно сломать наши проблемные наборы способом, все могут понять (все еще немного бита, подробного для моих вкусов хотя). Я думаю, что одной из самых важных вещей о Eclipse является превосходная интеграция SCM, это - то, что делает разработку команды настолько приятной. Мы используем Subversion+Eclipse, и это было очень продуктивно и очень легко обучить наших людей становиться экспертами в.

6
задан Willi Mentzel 16 March 2016 в 15:02
поделиться

4 ответа

Вам нужно использовать сообщение с многоэтапной кодировкой, чтобы PHP мог читать его так, как вы пытаетесь. Этот веб-сайт описывает хороший способ сделать это и содержит ссылки на библиотеки, которые могут вам помочь.

4
ответ дан 8 December 2019 в 02:24
поделиться

Все ответы на 100% верны. Вы также можете использовать простые сокеты, и в этом случае ваш метод будет выглядеть следующим образом:

        // Compose the request header
        StringBuffer buf = new StringBuffer();
        buf.append("POST ");
        buf.append(uploader.getUploadAction());
        buf.append(" HTTP/1.1\r\n");
        buf.append("Content-Type: multipart/form-data; boundary=");
        buf.append(boundary);
        buf.append("\r\n");
        buf.append("Host: ");
        buf.append(uploader.getUploadHost());
        buf.append(':');
        buf.append(uploader.getUploadPort());
        buf.append("\r\n");
        buf.append("Connection: close\r\n");
        buf.append("Cache-Control: no-cache\r\n");

        // Add cookies
        List cookies = uploader.getCookies();
        if (!cookies.isEmpty())
            {
                buf.append("Cookie: ");
                for (Iterator iterator = cookies.iterator(); iterator.hasNext(); )
                    {
                        Parameter parameter = (Parameter)iterator.next();

                        buf.append(parameter.getName());
                        buf.append('=');
                        buf.append(parameter.getValue());

                        if (iterator.hasNext())
                            buf.append("; ");
                    }

                buf.append("\r\n");
            }

        buf.append("Content-Length: ");

        // Request body
        StringBuffer body = new StringBuffer();
        List fields = uploader.getFields();
        for (Iterator iterator = fields.iterator(); iterator.hasNext();)
            {

                Parameter parameter = (Parameter) iterator.next();

                body.append("--");
                body.append(boundary);
                body.append("\r\n");
                body.append("Content-Disposition: form-data; name=\"");
                body.append(parameter.getName());
                body.append("\"\r\n\r\n");
                body.append(parameter.getValue());
                body.append("\r\n");
            }

        body.append("--");
        body.append(boundary);
        body.append("\r\n");
        body.append("Content-Disposition: form-data; name=\"");
        body.append(uploader.getImageFieldName());
        body.append("\"; filename=\"");
        body.append(file.getName());
        body.append("\"\r\n");
        body.append("Content-Type: image/pjpeg\r\n\r\n");

        String boundary = "WHATEVERYOURDEARHEARTDESIRES";
        String lastBoundary = "\r\n--" + boundary + "--\r\n";
        long length = file.length() + (long) lastBoundary.length() + (long) body.length();
        long total = buf.length() + body.length();

        buf.append(length);
        buf.append("\r\n\r\n");

        // Upload here
        InetAddress address = InetAddress.getByName(uploader.getUploadHost());
        Socket socket = new Socket(address, uploader.getUploadPort());
        try
            {
                socket.setSoTimeout(60 * 1000);
                uploadStarted(length);

                PrintStream out = new PrintStream(new BufferedOutputStream(socket.getOutputStream()));
                out.print(buf);
                out.print(body);

                // Send the file
                byte[] bytes = new byte[1024 * 65];
                int size;
                InputStream in = new BufferedInputStream(new FileInputStream(file));
                try
                    {
                        while ((size = in.read(bytes)) > 0)
                            {
                                total += size;
                                out.write(bytes, 0, size);
                                transferred(total);
                            }
                    }
                finally
                    {
                        in.close();
                    }

                out.print(lastBoundary);
                out.flush();

                // Read the response
                BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                while (reader.readLine() != null);
            }
        finally
            {
                socket.close();
            }
3
ответ дан 8 December 2019 в 02:24
поделиться

Вы не используете правильная семантика загрузки HTML-файла. Вы просто отправляете кучу данных по URL-адресу.

У вас есть 2 варианта:

  • Вы можете оставить код Java как есть и изменить код PHP, чтобы просто читать необработанный POST как файл.
  • Измените код Java, чтобы выполнить реальную загрузку файла, возможно, используя общую библиотеку .

Я бы рекомендовал изменить код Java, чтобы сделать это в соответствии со стандартами.

-1
ответ дан 8 December 2019 в 02:24
поделиться

Я понимаю, что это немного устарело, но я только что опубликовал ответ на аналогичный вопрос , который также должен быть применим и здесь. Он включает в себя код, похожий на код Даниила, но использует HttpURLConnection вместо Socket.

0
ответ дан 8 December 2019 в 02:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: