当前位置: 首页 > 知识库问答 >
问题:

我不能用JavaSpring Boot和Angular 7在远程服务器(Apache2)上上传文件。它适用于localhost

林祯
2023-03-14

我无法在远程服务器(apache2)上上传文件(图像)。我使用javaSpring引导作为后端,使用Angular 7作为前端)。在localhost:4200它工作得很好。在我从chrome浏览器控制台获得的远程服务器上:

POSThttp://www.xxx.tech:8081/images/upload400

错误:{时间戳:"2019-05-10T09:39:38.162 0000","状态": 400,"错误":"错误请求","消息":"未找到文件","路径":"/图像/上传"}"
标题: HttpHeaders{规范化名称: Map(0), lazyUpdate: null, lazyInit:}
消息:"Http失败响应http://www.xxx.tech:8081/images/upload: 400 OK"
名称:"HttpError响应"
ok: false
状态: 400
statusText:"OK"
url:"http://www.xxx.tech:8081/images/upload"

目录文件夹已经存在于VPS服务器上。如何使其工作?在我的controller.java我试图替换

File tmp = new File("../front/assets/img/").getCanonicalFile();

具有

File tmp = new File("./front/assets/img/").getCanonicalFile();

并与

File tmp = new File("/home/alexandra/www/front/assets/img/").getCanonicalFile();

但它仍然显示相同的错误消息

JAVA:ImageController。Java语言

@PostMapping(value="images/upload")
    public String uploadImage( @RequestParam("file") MultipartFile transferedFile) throws Exception{
        try {
            //FOR LOCALHOST (works)
            //File tmp = new File("../FRONT- 
            //Alexandra/src/assets/img/").getCanonicalFile();

            //FOR REMOTE SERVER (don't work)
            File tmp = new File("../front/assets/img/").getCanonicalFile();

            String destination = tmp.getPath() + "/" + transferedFile.getOriginalFilename();

            File data = new File(destination);
            transferedFile.transferTo(data);
            Image image = new Image(transferedFile.getOriginalFilename(), destination);
            imageRepository.save(image);
            return destination;

            }catch( Exception param_exception) { 
                throw new ResponseStatusException(
                    HttpStatus.BAD_REQUEST,
                    "No file found");
            }
    }

角度:mycomponent。组成部分ts

public apiUrl: string = environment.ApiUrl;
...

public uploadImaeg(): void {

      this.imgesUploaded.map(image => {

         if (image != null && image != undefined) {
            this.imagesService.addImage(image).subscribe();
         }  
      })     
   }

images.service.ts

public addImage(param_file: File): Observable<Object> {
        const headers: HttpHeaders = new HttpHeaders();
        const data: FormData = new FormData();

        data.append("file", param_file, param_file.name);
        headers.append("Content-Type", "multipart/form-data");
        const Obs: Observable<boolean> = this.serviceHttp.post(
            this.apiUrl + "images/upload", data, { headers: headers}
        ).pipe(
            map(
                (param_response: boolean) => {
                    return param_response;
                }
            )
        );
        return Obs;
    }

环境产品ts

export const environment = {
  production: true, 
  ApiUrl: 'http://'+document.location.hostname +':8081/'
};

共有2个答案

阙庆
2023-03-14

@AlexGera你让我明白了问题是什么:

我试过这样的代码:

private final Path rootLocation = Paths.get("images/upload");
    @PostConstruct
    public void init() {
      try {
        Files.createDirectories(rootLocation);
      }
      catch (IOException e) {
         throw new RuntimeException("Could not initialize storage", e);
      }
    }

    @PostMapping(value="images/upload")
    public String uploadImage( @RequestParam("file") MultipartFile transferedFile) throws Exception{
        try {

            File tmp = new File("/home/alexandra/www/front/assets/img/").getCanonicalFile();

            String destination = tmp.getPath() + "/" + transferedFile.getOriginalFilename();

            File data = new File(destination);
            transferedFile.transferTo(data);
            Image image = new Image(transferedFile.getOriginalFilename(), destination);
            imageRepository.save(image);
            return destination;

            }catch( Exception param_exception) { 
                throw new ResponseStatusException(
                    HttpStatus.BAD_REQUEST,
                    "No file found");
            }
    }

它没有解决问题,但在后面的文件夹中创建了一个文件夹:image/upload。而且,此文件夹的权限不是根目录,而不是filezilla服务器目录中所有文件夹的权限。是alexandra alexandra

因此,我更改了文件夹资产和文件夹img的权限(可能只有img,最后一个文件夹,应该可以工作,我不知道),因为我的路径是

/home/alexandra/www/front/assets/img/

我做到了:

cd /home/alexandra/www/front
sudo chown alexandra:alexandra assets
cd assets
sudo chown alexandra:alexandra img
sudo service myserver stop
sudo service myserver start
sudo systemctl restart apache2

它成功了

葛驰
2023-03-14

我看不出您实际上创建了存储目录。您可能希望添加显式目录创建,因为您的bean初始化方法类似于:

private final Path rootLocation = Paths.get("upload");
@PostConstruct
public void init() {
  try {
    Files.createDirectories(rootLocation);
  }
  catch (IOException e) {
     throw new StorageException("Could not initialize storage", e);
  }

}

 类似资料:
  • 我正在尝试使用多部分上传功能将许多大文件(30GB)上传到S3存储桶。 这是代码。为了避免弄乱这一页,我把它放在一个要点里:https://gist.github.com/twslankard/5296081 上传小于5GB的文件没有问题。根据S3管理控制台中对象的大小,大于5GB的文件似乎被“裁剪”为5GB。 在上传过程中,我没有收到任何异常或错误消息。我在文档中也找不到任何东西表明我做错了什么

  • 我想在远程服务器上上传文件,目前我只能在本地机器上上传。下面是我的代码 提前感谢!

  • 我尝试用java GraphQL上传文件。我研究了这个主题的解决方案:如何用GraphQL-Java上传文件?我使用的是graphql-java版本11.0、graphql-spring-boot-starter版本5.0.2、graphql-java-kickstart版本7.5.0。 我做错了什么?

  • 我想上传一个文件到不同的服务器使用卷曲。我读过许多类似的问题,但我没有得到任何解决我的问题。下面是我现在得到的代码: 当我运行此脚本时,它将保持运行200秒,并以以下方式响应: Sep 17 20:56:58 xxxxx vsftpd[2613]:[user]确定登录:客户端“yyyyy” Sep 17 20:56:58 xxxxx vsftpd[2618]:[用户]FTP响应:客户端“YYYYY

  • 问题内容: 我正在使用使用大量ajax的grails创建一个web应用程序。我想使用ajax实现文件上传。我不知道如何使用ajax进行文件上传。我的示例GSP代码是: 我尝试了和。上传后,我想用结果更新“ updateArea”。结果,我打算显示上传文件的详细信息。 问题答案: 通过Ajax上载文件实际上是不可能的。您仍然可以使用隐藏的iframe在后台上传文件,并评估响应(位于iframe内)或

  • 我需要登录到unix服务器,执行switch user,执行一些命令,然后将这些命令创建的文件scp到另一台服务器。我能够连接到服务器,执行sudo登录和执行命令,但我无法将文件直接scp到另一个远程服务器。 我用的是Jsch jar。下面是我的代码。 public void executeChannel(会话会话、字符串命令、字符串pwd、列表文件)引发异常{ command=sudo su-p