如何保存通过AngularJS上传的文件和游戏框架1.3?

时间:2022-04-14 10:05:18

I'm adding file upload functionality to the form of data collection for some clients. Have such a problem...

我正在为一些客户添加文件上传功能到数据收集的形式。有这样一个问题……

Here is a simple file upload functionality.

这是一个简单的文件上传功能。

I'm uploading the file to the server, but can not save it there. Generally speaking, I would like to keep the file in the database, for this I created a corresponding table (MS SQL, showed relevant part).

我将文件上载到服务器,但不能保存在那里。一般来说,我希望将文件保存在数据库中,为此我创建了相应的表(MS SQL,显示相关部分)。

CREATE TABLE [dbo].[Client](
    [id] [numeric](19, 0) IDENTITY(1,1) NOT NULL,
    ... 
    [fileName] [varchar](255) NULL,
    [blobImage] [varbinary](max) NULL,
PRIMARY KEY CLUSTERED 
(
 ...    
) 

Relevant part of the AngularJS View (AddClient.html):

AngularJS视图的相关部分(AddClient.html):

...
<div class="wrapper wrapper-content animated fadeInRight" ng-controller="AddClientCtrl">
...
    <div class="row">
        <label for="fileToUpload">Select a File to Upload</label><br />
        <input type="file" 
               ng-model-instant 
               id="fileToUpload" 
               name="fileToUpload" 
               multiple 
               onchange="angular.element(this).scope().setFiles(this)" />
    </div>

    <div ng-show="files.length">
        <div ng-repeat="file in files.slice(0)">
            <span>{{file.webkitRelativePath || file.name}}</span>
            (<span ng-switch="file.size > 1024*1024">
            <span ng-switch-when="true">{{file.size / 1024 / 1024 | number:2}} MB</span>
            <span ng-switch-default>{{file.size / 1024 | number:2}} kB</span>
        </span>)
        </div>
        <input type="button" ng-click="uploadFile()" value="Upload" />
    </div>
...

Relevant part of part of the AngularJS Controller (AddClient.js):

AngularJS控制器(AddClient.js)部分的相关部分:

function AddClientCtrl($scope, $http, $resource, Clients) {

       $scope.setFiles = function(element) {
       $scope.$apply(function($scope) {
           $scope.files = [];
           for (var i = 0; i < element.files.length; i++)
              $scope.files.push(element.files[i]);
         });
       };

        $scope.uploadFile = function() {
            $scope.formData = new FormData();
            for(var i in $scope.files) {
                $scope.formData.append("uploadedFile", $scope.files[i])
            }

            var xhr = new XMLHttpRequest();
            xhr.open("POST", "/api/clients/savefile");
            xhr.send($scope.formData);
        } 
      ...  
}

AddClientCtrl.$inject = ['$scope', '$http', '$resource', 'Clients'];

Relevant part of the Play 1.3 route (routes.conf)

游戏的相关部分(路线。conf)

POST    /api/clients/savefile   ClientController.saveFile

Relevant part of the Play 1.3 Controller (ClientController.java):

Play 1.3控制器的相关部分(ClientController.java):

public class ClientController extends Controller {

    ...

    public static void saveFile() {
        File[] files = params.get("uploadedFile", File[].class);
        for(File file : files) {
            Logger.info(file.getName());
            Logger.info(f.getName());
            Logger.info(f.getAbsolutePath());
            Logger.info(f.length());
        }
    }
}

I can see the file name, the file size and other attributes of the file.

我可以看到文件的文件名、文件大小和其他属性。

But how can I save it? I would be very grateful for the information. Thanks to all.

但是我怎么才能挽救它呢?我将非常感激这些信息。感谢所有。

2 个解决方案

#1


0  

One of the possible solutions is to save files in the file system of the server.

可能的解决方案之一是在服务器的文件系统中保存文件。

For example.

为例。

Relevant part of the Play 1.3 Controller (ClientController.java):

Play 1.3控制器的相关部分(ClientController.java):

public class ClientController extends Controller {
    ...
    public static void saveFile() {
        File[] files = params.get("uploadedFile", File[].class);
        File destFile = null;
        String uploadedFileName;
        String uploadedFileDirs = "c:\\uploaded\\files\\";

        for(File file : files) {
            uploadedFileName = file.getName();
            destFile = new File(uploadedFileDirs + uploadedFileName);
            destFile.getParentFile().mkdirs();
            try {
                destFile.createNewFile();
            } catch (IOException e) {
                e.printStackTrace();
            }

            try {
                byte[] bytes = ClientControllerHelper.readBytesFromFile(file);
                ClientControllerHelper.writeBytesToFile(destFile, bytes);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
   ...
}

Relevant part of the helper class (ClientControllerHelper.java):

助手类的相关部分(ClientControllerHelper.java):

public class ClientControllerHelper {
    ...
    public static byte[] readBytesFromFile(File file) throws IOException {
        InputStream inputStream = new FileInputStream(file);
        long length = file.length();
        if(length > Integer.MAX_VALUE) {
            throw new IOException("Could not completely read file " +
                    file.getName() + " as it is too long (" + length + " bytes, max supported " +
                        Integer.MAX_VALUE + ")");
        }

        byte[] bytes = new byte[(int)length];
        int offset = 0;
        int numRead = 0;
        while (offset < bytes.length && (numRead = inputStream.read(bytes, offset, bytes.length-offset)) >= 0) {
            offset += numRead;
        }

        if(offset < bytes.length) {
            throw new IOException("Could not completely read file " + file.getName());
        }

        inputStream.close();
        return bytes;
    }

    public static void writeBytesToFile(File theFile, byte[] bytes) throws IOException {
        BufferedOutputStream bufferedOutputStream = null;
        try {
            FileOutputStream fos = new FileOutputStream(theFile);
            bufferedOutputStream = new BufferedOutputStream(fos);
            bufferedOutputStream.write(bytes);
        } finally {
            if(bufferedOutputStream != null) {
                try {
                    bufferedOutputStream.flush();
                    bufferedOutputStream.close();
                } catch(Exception e){ ... }
            }
        }
    }
    ...
}

#2


0  

How to save the image in the database MS-SQL in form string of Base64 (should remember about limitation [varbinary] (max)).

如何在Base64的表单字符串中保存数据库MS-SQL中的图像(应该记住限制[varbinary] (max))。

Model:

模型:

@Entity
@PersistenceUnit(name = "...")
@Table(name="MANAGED_OBJECT")
public class ManagedObject extends Model {
    @Required
    @Column(name = "MANAGED_OBJECT_NAME")
    public String ManagedObjectName;

    @Required
    @Column(name = "MANAGED_OBJECT_IMAGE")
    public String ManagedObjectImage;

    ...
}

Action of the controller:

行动的控制器:

public class ManagedObjectsController extends Controller {

    ...

    @Transactional
    public static void saveFile() {

        ManagedObject managedObject = new ManagedObject();
        managedObject.ManagedObjectName = "testName";

        String clientId = request.params.get("clientId");
        File[] files = request.params.get("uploadedFile", File[].class);
        String uploadedFileName;

        for(File file : files) {
            FileInputStream imageInFile = null;
            try {
                imageInFile = new FileInputStream(file);
                byte imageData[] = new byte[(int) file.length()];
                imageInFile.read(imageData);

                String imageDataString = Base64.encodeBase64URLSafeString(imageData)
                        .replaceAll("_", "/").replaceAll("-", "+");
                managedObject.ManagedObjectImage = imageDataString;
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
            managedObject.save();
       }
    }
}

Part of AngularJS controller:

AngularJS控制器的一部分:

 $scope.uploadFile = function() {
    $scope.formData = new FormData();
    for(var i in $scope.files) {
        $scope.formData.append("uploadedFile", $scope.files[i])
    }

    var xhr = new XMLHttpRequest();
    xhr.open("POST", "/api/clients/savefile");
    xhr.send($scope.formData);
 } 

<img> tag in view:

< img >标记的视图:

<img ng-src="data:image/JPEG;base64,{{managedObject.ManagedObjectImage}}"/>

Representation of the image in form of the string, encoded in Base64:

以Base64编码的字符串形式表示图像的形式:

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

如何保存通过AngularJS上传的文件和游戏框架1.3?

#1


0  

One of the possible solutions is to save files in the file system of the server.

可能的解决方案之一是在服务器的文件系统中保存文件。

For example.

为例。

Relevant part of the Play 1.3 Controller (ClientController.java):

Play 1.3控制器的相关部分(ClientController.java):

public class ClientController extends Controller {
    ...
    public static void saveFile() {
        File[] files = params.get("uploadedFile", File[].class);
        File destFile = null;
        String uploadedFileName;
        String uploadedFileDirs = "c:\\uploaded\\files\\";

        for(File file : files) {
            uploadedFileName = file.getName();
            destFile = new File(uploadedFileDirs + uploadedFileName);
            destFile.getParentFile().mkdirs();
            try {
                destFile.createNewFile();
            } catch (IOException e) {
                e.printStackTrace();
            }

            try {
                byte[] bytes = ClientControllerHelper.readBytesFromFile(file);
                ClientControllerHelper.writeBytesToFile(destFile, bytes);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
   ...
}

Relevant part of the helper class (ClientControllerHelper.java):

助手类的相关部分(ClientControllerHelper.java):

public class ClientControllerHelper {
    ...
    public static byte[] readBytesFromFile(File file) throws IOException {
        InputStream inputStream = new FileInputStream(file);
        long length = file.length();
        if(length > Integer.MAX_VALUE) {
            throw new IOException("Could not completely read file " +
                    file.getName() + " as it is too long (" + length + " bytes, max supported " +
                        Integer.MAX_VALUE + ")");
        }

        byte[] bytes = new byte[(int)length];
        int offset = 0;
        int numRead = 0;
        while (offset < bytes.length && (numRead = inputStream.read(bytes, offset, bytes.length-offset)) >= 0) {
            offset += numRead;
        }

        if(offset < bytes.length) {
            throw new IOException("Could not completely read file " + file.getName());
        }

        inputStream.close();
        return bytes;
    }

    public static void writeBytesToFile(File theFile, byte[] bytes) throws IOException {
        BufferedOutputStream bufferedOutputStream = null;
        try {
            FileOutputStream fos = new FileOutputStream(theFile);
            bufferedOutputStream = new BufferedOutputStream(fos);
            bufferedOutputStream.write(bytes);
        } finally {
            if(bufferedOutputStream != null) {
                try {
                    bufferedOutputStream.flush();
                    bufferedOutputStream.close();
                } catch(Exception e){ ... }
            }
        }
    }
    ...
}

#2


0  

How to save the image in the database MS-SQL in form string of Base64 (should remember about limitation [varbinary] (max)).

如何在Base64的表单字符串中保存数据库MS-SQL中的图像(应该记住限制[varbinary] (max))。

Model:

模型:

@Entity
@PersistenceUnit(name = "...")
@Table(name="MANAGED_OBJECT")
public class ManagedObject extends Model {
    @Required
    @Column(name = "MANAGED_OBJECT_NAME")
    public String ManagedObjectName;

    @Required
    @Column(name = "MANAGED_OBJECT_IMAGE")
    public String ManagedObjectImage;

    ...
}

Action of the controller:

行动的控制器:

public class ManagedObjectsController extends Controller {

    ...

    @Transactional
    public static void saveFile() {

        ManagedObject managedObject = new ManagedObject();
        managedObject.ManagedObjectName = "testName";

        String clientId = request.params.get("clientId");
        File[] files = request.params.get("uploadedFile", File[].class);
        String uploadedFileName;

        for(File file : files) {
            FileInputStream imageInFile = null;
            try {
                imageInFile = new FileInputStream(file);
                byte imageData[] = new byte[(int) file.length()];
                imageInFile.read(imageData);

                String imageDataString = Base64.encodeBase64URLSafeString(imageData)
                        .replaceAll("_", "/").replaceAll("-", "+");
                managedObject.ManagedObjectImage = imageDataString;
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
            managedObject.save();
       }
    }
}

Part of AngularJS controller:

AngularJS控制器的一部分:

 $scope.uploadFile = function() {
    $scope.formData = new FormData();
    for(var i in $scope.files) {
        $scope.formData.append("uploadedFile", $scope.files[i])
    }

    var xhr = new XMLHttpRequest();
    xhr.open("POST", "/api/clients/savefile");
    xhr.send($scope.formData);
 } 

<img> tag in view:

< img >标记的视图:

<img ng-src="data:image/JPEG;base64,{{managedObject.ManagedObjectImage}}"/>

Representation of the image in form of the string, encoded in Base64:

以Base64编码的字符串形式表示图像的形式:

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

如何保存通过AngularJS上传的文件和游戏框架1.3?