Я вижу изображение в папке ресурсов моего проекта, но все еще получаю неверную ссылку URL - PullRequest
0 голосов
/ 13 мая 2019

Итак, у меня есть программа, в которой пользователи могут загрузить изображение, а затем сохранить его и продукт в интернет-магазине. Но у меня очень странная проблема, когда ни одно из имен файлов не распознается. Обычно пользователь использует средство выбора файлов для локальной загрузки файла. Я пробовал это в своей папке ресурсов, я пробовал это к ресурсам / изображениям, и я пытался сохранить это к главному / изображениям, и каждый раз происходит то же самое. пользователи выбирают фотографию, которую они хотят загрузить, я смотрю, как она идет в нужную папку, но затем, когда пользователь нажимает кнопку загрузки и создает новый продукт, выдается сообщение о том, что недействительный URL-адрес или ресурс не существует. вот в чем дело. ресурс существует. Я смотрю, как это появляется в моем окне проекта Intellij. Я даже печатаю путь к файлу консоли, если нет, он идет куда-то еще, но нет, это правильный путь к файлу. Я подумал, что может быть какая-то странная опечатка, поэтому я перетащил файл в терминал, и нет, это точный путь к файлу. Я схожу с ума, пытаясь понять это.

где происходит загрузка

public class UploadItems {

    @FXML private TextField productName;
    @FXML private TextField quantityForSale;
    @FXML private TextField prices;
    @FXML private Image image;
    @FXML private Button imageUploadBtn;
    @FXML private Button uploadBtn;
    private MainController mainController;
    private File file;
    private ConnectToDb connectToDb = new ConnectToDb();
    private StoreHomePageController storeHomePageController;
    private final String fileLocation = "/Users/myname/IdeaProjects/AmeenazonOnlineStore/src/main/Images";

    public UploadItems(){
        mainController = new MainController();
        storeHomePageController = new StoreHomePageController(mainController);

    }
    @FXML
    private void initialize(){

        imageUploadBtn.setOnAction(e -> {
            uploadImageBtn();
        });
        uploadBtn.setOnAction(e -> {
            uploadBtn();

        });
    }
    private void uploadBtn(){
        String name = productName.getText();
        String otherFileLocation = "/Users/myname/IdeaProjects/AmeenazonOnlineStore/src/main/Images/";
        int quantity = Integer.parseInt(quantityForSale.getText());
        int price = Integer.parseInt(prices.getText());
        String filename = otherFileLocation + file.getName();

        if (!name.isEmpty() && quantity > 0 && price > 0){
            String query = " INSERT INTO products(name, price, quantity, filename)"
                    + " VALUES(?, ?, ?, ?)";
            try {
                PreparedStatement preparedStatement = connectToDb.getConn().prepareStatement(query);
                preparedStatement.setString(1, name);
                preparedStatement.setInt(2, price);
                preparedStatement.setInt(3, quantity);
                preparedStatement.setString(4, filename);

                if (checkTableForProduct()){
// error is thrown here because the filename is invalid. printing to the console right here will show the valid file name
                    storeHomePageController.addToVBoxList(new Product(name, price, quantity, filename));

                    System.out.println("product added... hopefully ");
                    Alert alert = new Alert(Alert.AlertType.INFORMATION);
                    alert.setTitle("Item Successfully Uploaded!");
                    alert.setHeaderText("You can now sell your stuff. We can't wait for our cut");
                    alert.setContentText("You better not stiff us or we'll send our goons out to get you!");
                    alert.showAndWait();
                }
            } catch (SQLException ex) {
                ex.printStackTrace();
            } try {

                Window window = uploadBtn.getScene().getWindow();
                window.hide();
                FXMLLoader loader = new FXMLLoader(getClass().getResource("/StoreHomePageLayout.fxml"));
                loader.setController(new StoreHomePageController(mainController));
                Stage secondaryStage = new Stage();
                secondaryStage.setTitle("Ameenazon");
                secondaryStage.setHeight(800);
                secondaryStage.setWidth(800);
                Scene scene = new Scene(loader.load());
                secondaryStage.setScene(scene);
                secondaryStage.show();

            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }
    }
    private void uploadImageBtn(){
        String otherFileLocation = "/Users/myname/IdeaProjects/AmeenazonOnlineStore/src/main/Images/";
        Stage stage = new Stage();
        FileChooser fileChooser = new FileChooser();
        fileChooser.setTitle("Select Image");

        file = fileChooser.showOpenDialog(stage);
        if (file != null){
            Path movefrom = FileSystems.getDefault().getPath(file.getPath());
            Path target = FileSystems.getDefault().getPath(otherFileLocation  +  file.getName());
            imageUploadBtn.getProperties().put(otherFileLocation, file.getAbsolutePath());
            System.out.println("image upload button ");
            try{
                Files.move(movefrom,target, StandardCopyOption.ATOMIC_MOVE);
                System.out.println("image moved");
            } catch (IOException ex){
                ex.printStackTrace();
            }
        }
    }

и вот класс продуктов

public class Product {

    private String name;
    private String companyName;
    private double price;
    private int quantity;
    private String description;
    private ImageView imageView;
    private String fileName;
    private String info;
    private Image image;
 quantity, String description, Image image, String fileName, String info){
    public Product(String name, double price, int quantity, String fileNames)  {
        this.name = name;
        this.companyName = companyName;
        this.price = price;
        this.description = description;
        this.imageView = imageView;
        this.quantity = quantity;
        this.fileName = fileNames;
        System.out.println(this.fileName);
        System.out.println(fileNames);
// these both print the correct file path to the correct file which I can see in my project window 
        this.info = info;
        this.image = new Image(fileNames);
// a bunch of getters
}

Так что да, я понятия не имею, что происходит. Это потому, что я устанавливаю действия кнопок в инициализации FXML? Я вижу, что файл .png добавлен в мой проект. мне не имеет смысла, что я получаю недопустимый URL или ресурс не существует ошибки, когда я вижу это ... в правильной папке. Я даже могу добавить видеоклип файла, идущего в нужное место, а затем сказать, что там нет файла.

метод, который добавляет продукт на домашнюю страницу в порядке. Это работало в прошлом. это действительно только имя файла, которое дает мне ошибку.

Спасибо

Ответы [ 2 ]

0 голосов
/ 13 мая 2019

Конструктор Image ожидает URL, а не имя файла.Вы пропустили схему;Кроме того, допустимые имена файлов могут быть недействительными URL.

Используйте функции File или Path s для преобразования в URL:

String filename = new File(otherFileLocation + file.getName()).toURI().toString();
0 голосов
/ 13 мая 2019

Вы пытались загрузить изображение как файл, а не как строку?

try {
    File pathToFile = new File("image.png");
    Image image = ImageIO.read(pathToFile);
} catch (IOException ex) {
    ex.printStackTrace();
}
...